Bash
後台函式“$!”的PID給出錯誤的值
我正在嘗試擷取在後台執行的函式的 PID,但我似乎得到了錯誤的數字。
請參閱以下腳本:
$ cat test1.sh #!/bin/bash set -x child() { echo "Child thinks is $$" sleep 5m } child & child_pid="$!" echo "Parent thinks pid $child_pid" sleep 3 kill -- -"$child_pid" # but it is wrong, get "No such process" kill -- -"$$" wait
我希望父程序終止函式的子程序,但我得到:
$ ./test1.sh + child_pid=44551 + echo 'Parent thinks pid 44551' Parent thinks pid 44551 + sleep 3 + child + echo 'Child thinks is 44550' Child thinks is 44550 + sleep 5m + kill -- -44551 ./test1.sh: line 15: kill: (-44551) - No such process + kill -- -44550 Terminated
我已經閱讀了這個問題Get PID of a function executed in the background,但答案似乎與我所觀察到的相矛盾。
那麼如何修復上面的程式碼,從父級獲取正確的函式 PID 呢?
經過一些測試,似乎沒有減號的命令有效
kill -- "$child_pid"
但這還不足以滿足我的需要,因為我想
child
在殺死它時終止它的任何子程序。
$!
給出正確的值。
$$
才不是。$BASHPID
改為使用見
man bash
:BASHPID
擴展為目前 bash 程序的程序 ID。在某些情況下,這與 $$ 不同,例如不需要重新初始化 bash 的子 shell。對 BASHPID 的分配無效。
不確定,為什麼你
kill -- -PID
的不工作,無法重現。你可以pkill -P PID
改用。