代码之家  ›  专栏  ›  技术社区  ›  ByteMe95

linux-信号未传递给multi命令

  •  0
  • ByteMe95  · 技术社区  · 6 年前

    简单的测试,我有一个python脚本,它注册了一个sigterm处理程序,并在得到它时打印出来。如果我运行它并发送一个术语,我已经验证了它的有效性。

    但是,我碰巧将其作为一个python子进程运行,useShell=True。useShell使用/bin/sh-c启动命令。。。

    $/bin/sh -c "python ~/tmpcode/signal_test.py" &
    [8] 6207
    $ kill 6207
     signum 15
    

    但是,我有一些脚本可以执行链接命令,即/foo/bar.sh;一些其他脚本.py。在这种情况下,信号是

    $ /bin/sh -c "echo foo; python ~/tmpcode/signal_test.py" &
    [8] 8015
    $ kill 8015
    

    如果我尝试&&而不是 我试图了解这里发生了什么,以及是否有办法让信号传递出去。

    信号_test.py:

    import time
    import signal
    import sys
    
    def handler( signum, frame ):
        print( "signum %d\n" % signum ) 
        sys.exit(signum)
    
    signal.signal( signal.SIGTERM, handler )
    time.sleep(60)
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Zang MingJie    6 年前

    让我解释一下细节。

    bash返回的数字不是pid,而是pgid(进程组id)

    在shell中运行命令时,shell将创建一个新的进程组。该组将包含命令中的所有进程。pgid与leader进程的pid相同。

    shell何时创建多个进程或单个进程?

    显然,当一个进程不能处理多个shell命令时,它将无法处理多个进程。

    $/bin/sh -c "python ~/tmpcode/signal_test.py" &
    [8] 6207
    

    只发出一个命令,因此子shell本身( /bin/sh )变成 python

    在第二个例子中

    $ /bin/sh -c "echo foo; python ~/tmpcode/signal_test.py" &
    [8] 8015
    

    发出两个命令,单进程无法完成任务,需要多进程:

    /bin/sh
        echo
        python
    

    将创建一个包含这三个流程的流程组。

    如何向进程组发送信号?

    使用

    kill <SIGNAL> -<pgid>
    

    pgid前面的减号是必需的。