Bash
Bash 執行多個程序並處理關閉
我有一個執行多個程序的 bash 腳本
#!/bin/sh python program1.py & python program2.py & other programs ... & lastProgram
我執行它
./myscript.sh
當我點擊
Ctrl
+C
關閉它時,lastProgram
它退出並且所有其他的繼續在後台執行。問題是需要終止其他程序。處理從腳本啟動的所有程序關閉的正確方法是什麼?
收集程序 ID,在退出時終止後台程序。
#!/bin/bash killbg() { for p in "${pids[@]}" ; do kill "$p"; done } trap killbg EXIT pids=() background job 1 & pids+=($!) background job 2... & pids+=($!) foreground job
Trapping
EXIT
在 shell 退出時執行該函式,無論原因如何。您可以將其更改trap killbg SIGINT
為僅在^C
.在腳本嘗試拍攝它們之前,這不會檢查其中一個後台程序是否已退出。如果他們這樣做,您可能會出錯,或者更糟糕的是,拍攝錯誤的流程。
或者通過工作 ID 殺死他們。讓我們閱讀 的輸出
jobs
以找出哪些仍然處於活動狀態。#!/bin/bash killjobs() { for x in $(jobs | awk -F '[][]' '{print $2}' ) ; do kill %$x done } trap killjobs EXIT sleep 999 & sleep 1 & sleep 999 & sleep 30
如果您執行產生其他程序的後台程序(如子外殼:)
(sleep 1234 ; echo foo) &
,則需要使用set -m
(“監控模式”)啟用作業控制才能使其工作。否則僅終止引導過程。