Bash

殺死在函式內開始的工作

  • March 26, 2018

我試圖在 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的 pid jobs -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 -$!

引用自:https://unix.stackexchange.com/questions/433704