![后台函数“$!”的PID给出错误的值](https://linux22.com/image/187717/%E5%90%8E%E5%8F%B0%E5%87%BD%E6%95%B0%E2%80%9C%24!%E2%80%9D%E7%9A%84PID%E7%BB%99%E5%87%BA%E9%94%99%E8%AF%AF%E7%9A%84%E5%80%BC.png)
我试图捕获在后台执行的函数的 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
它来代替。