我有一個運行無盡的命令作爲後臺進程是bash:bash關機掛鉤;或者,殺死所有後臺進程,當主進程被殺死
#!/bin/bash
function xyz() {
# some awk command
}
endlesscommand "param 1" | xyz & # async
pids=$!
endlesscommand "param 2" | xyz & # async
pids="$pids "$!
endlesscommand "param 3" | xyz # sync so the script doesn't leave
停止該腳本的唯一方法是(必須)按Ctrl-C或殺滅和當發生這種情況時,我需要殺死$ pids變量中列出的所有後臺進程。 我該怎麼做?
如果有可能趕在主過程中的終止信號,這時執行功能(關閉掛鉤),我會做這樣的事情:
for $pid in $pids; do kill $pid; done;
但我找不到如何從以下職位做到這一點...
SOLUTION:
#!/bin/bash
function xyz() {
# some awk command
}
trap 'jobs -p | xargs kill' EXIT # part of the solution
endlesscommand "param 1" | xyz & # async
endlesscommand "param 2" | xyz & # async
endlesscommand "param 3" | xyz & # don't sync, but wait:
# other part of the solution:
while pgrep -P "$BASHPID" > /dev/null; do
wait
done
你需要使用陷阱... – devnull
沒有必要維護一個明確的子進程列表;您可以調用'jobs -p'來獲取仍在運行的子進程的ID。 – chepner