2017-08-22 75 views
0

我想:擊:等待在後臺巨蟒過程

  1. 啓動一個後臺進程(python腳本)
  2. 運行一些命令的bash
  3. 然後發送控制-C關閉後臺進程一旦前臺任務完成

我已經試過的小例子 - Python的test.py

import sys 

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

猛砸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) 
+0

Thanks @Ruslan - 我能夠通過在python中重新添加信號處理程序來解決我的問題。 –

回答

0

的一點是SIGINT用來終止前臺進程。您應該直接使用kill $pid來終止後臺進程。

BTW,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 
+0

我想發送一箇中斷(相當於按下control-C),我可以在python中捕獲,以便乾淨地關閉。 'SIGTERM'只是終止後臺進程。 –

+0

好的,我明白你的意思了,我會更新我的答案。 – Sraw