簡體   English   中英

如何終止在 bash 腳本中運行的 2 個后台進程?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM