后台函数“$!”的PID给出错误的值

后台函数“$!”的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

我读过这个问题获取后台执行函数的PID,但答案似乎与我所观察到的相矛盾。

那么我该如何修复上面的代码,以从父级获取函数的正确 PID?


经过一些测试后,似乎没有减号的命令可以工作

kill -- "$child_pid" 

但这不足以满足我的需要,因为我想child在杀死它时终止它的任何子进程。

答案1

$!给出正确的值。
$$才不是。改用$BASHPID

man bash

巴什PID

扩展为当前 bash 进程的进程 ID。这在某些情况下与 $$ 不同,例如不需要重新初始化 bash 的子 shell。对 BASHPID 的分配没有效果。

不确定,为什么你的kill -- -PID不工作,无法重现。你可以用pkill -P PID它来代替。

相关内容