Bash:等待背景python进程

时间:2017-08-22 01:34:48

标签: python linux bash macos shell

我试图:

  1. 启动后台进程(python脚本)
  2. 运行一些bash命令
  3. 然后发送control-C以在前台任务完成后关闭后台进程
  4. 我尝试过的最简单的例子 - Python test.py

    import sys
    
    try:
        print("Running")
        while True:
            pass
    except KeyboardInterrupt:
        print("Escape!")
    

    Bash test.sh

    #!/bin/bash
    
    python3 ./test.py &
    pid=$!
    
    # ... do something here ...
    sleep 2
    
    # Send an interrupt to the background process
    # and wait for it to finish cleanly
    echo "Shutdown"
    kill -SIGINT $pid
    wait
    
    result=$?
    echo $result
    exit $result
    

    但是bash脚本似乎挂在等待上,并且SIGINT信号没有被发送到python进程。

    我正在使用Mac OS X,正在寻找适用于linux + mac上的bash的解决方案。

    编辑: Bash正在发送中断,但Python在作为后台作业运行时没有捕获它们。修复了在Python脚本中添加以下内容:

    import signal
    signal.signal(signal.SIGINT, signal.default_int_handler)
    

1 个答案:

答案 0 :(得分:0)

SIGINT用于终止前台进程。您应该直接使用kill $pid来终止后台进程。

顺便说一句,kill $pid等于kill -15 $pidkill -SIGTERM $pid

更新

您可以使用signal模块来处理这种情况。

import signal
import sys
def handle(signum, frame):
    sys.exit(0)
signal.signal(signal.SIGINT, handle)
print("Running")
while True:
    pass