Bash
殺死在函式內開始的工作
我試圖在 bash 腳本中使用一些函式來簡化呼叫一些子程序。我想在呼叫站點決定是在後台執行該程序作為作業還是在前台執行,然後在必要時終止子程序。不幸的是,據我所知,我得到的 pid
$!
不屬於長期執行的後台程序,而是呼叫它的函式。用 $ 殺死我得到的 pid!不會殺死長時間執行的子程序,並且它似乎成為孤立的。function inner() { tail -f /dev/null } function outer() { inner } outer & echo 'Before, $!: ' $! echo 'Before, jobs -p: ' $(jobs -p) echo 'Before, ps aux: ' $(ps aux | grep /dev/null | grep -v grep) kill $! echo 'After, $!: ' $! echo 'After, jobs -p: ' $(jobs -p) echo 'After, ps aux: ' $(ps aux | grep /dev/null | grep -v grep)
我得到的輸出是:
Before, $!: 71644 Before, jobs -p: 71644 Before, ps aux: jstaab 71646 0.0 0.0 4267744 688 s005 S+ 2:53PM 0:00.00 tail -f /dev/null After, $!: 71644 After, jobs -p: 71644 ./test.sh: line 17: 71644 Terminated: 15 outer After, ps aux: jstaab 71646 0.4 0.0 4267744 688 s005 S+ 2:53PM 0:00.00 tail -f /dev/null
你會注意到這
ps aux
給了我一個不同於$!
or的 pidjobs -p
。這是有道理的,但是我怎樣才能在沒有 grepping 命令的情況下tail -f /dev/null
用 a殺死?kill
outer &
創建一個子shell。$!
給出這個子外殼的 PID。
tail -f /dev/null
是這個子shell的一個子shell,所以它有不同的PID。但你可以做exec tail -f /dev/null
反而。然後
kill
擊中tail
。另一種可能性是使用
/bin/kill
內置的 shell 代替。使用負數作為參數,您可以殺死整個程序組:/bin/kill -TERM -$!