Bash可以使用wait
等待直接启动的进程。但是,如果进程派生了一个子进程,然后执行了bash
(即,父进程变成了bash
),则新执行的Bash进程将无法等待“继承的”子进程。这是最小的复制品:
#/bin/bash
sleep inf &
pid=$!
exec bash -c "wait $pid;"'echo This shell is $$; sleep inf'
给出以下输出:
$ bash test.sh
bash: wait: pid 53984 is not a child of this shell
This shell is 53983
但是,pstree显示子pid确实是shell的子:
$ pstree -p 53983
bash(53983)─┬─sleep(53984)
└─sleep(53985)
似乎Bash在内部跟踪生成的进程,并查询该列表,而不是直接调用waitpid(2)
(zsh
存在相同的问题,但是ksh
可以正常工作)。
是否有任何方法可以解决此问题,并使Bash将“继承的”子代添加到其内部结构中?