Bash

後台函式“$!”的PID給出錯誤的值

  • February 8, 2021

我正在嘗試擷取在後台執行的函式的 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改用。

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