[英]How to terminate 2 background processes running in bash script?
我希望這兩個后台進程結束,例如,在按下 CTRL + C 后,我發現唯一可以幫助的方法,但這不能正常工作:
python3 script1.py &
python3 script2.py &
trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT
或者是否有另一種解決方案可以並行運行 2 個腳本? 不一定在后台。
我會使用一些東西
function killSubproc(){
kill $(jobs -p -r)
}
./test.py one 10 &
./test.py two 5 &
trap killSubproc INT
wait
如您所見,它不限於 2 個子流程。 這個想法只是在您點擊 Ctrl+C 作業時殺死所有(仍在運行的)進程 -p -r 給出所有正在運行的子進程的進程號(-r 限制正在運行的子進程,因為您的某些腳本可能已經自然終止了;- p 給出進程號,而不是作業號)
等待,沒有任何參數,等待所有子進程結束。 這樣,您的主腳本在一些子任務運行時在前台運行。 它仍然接收 ctrl+c。 但是,如果您的所有子進程自然終止,它就會終止。 如果你按 ctrl+c
注意:test.py 只是我使用的一個測試腳本,它運行 $2 秒(這里是 10 和 5)並且每秒顯示 $1 字符串(這里是一個和兩個)
kill -- -$$
使用$$
, shell 腳本的進程 ID 作為組 ID。 這些不是一回事。
您需要獲取 shell 腳本的組 ID 並使用它。 這應該有效。
ps -o pgid= -p $$
這是一個完整的例子:
#/bin/bash -e
trap "kill -s INT -- -$(ps -o pgid= -p $$); wait" EXIT
python3 -c 'import time, signal, sys
def handler(a,b):
print("sigint!")
sys.exit(0)
signal.signal(signal.SIGINT, handler)
for i in range(3):
time.sleep(1)
print("hi from python")
' &
sleep 1
設置好trap
后,您應該會看到sigint!
. 注釋掉trap
后,您的 python 將繼續運行,就像您自己體驗的那樣。
在我的示例中,我還在trap
代碼中添加了一個wait
,以確保當 shell 腳本結束時,所有進程組也結束。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.