一步杀死并等待

kill & wait in one step

如果我使用组合批量杀死一个子进程并等待它终止,我使用

kill $PID
wait $PID

如果进程立即存在,wait 将失败,因为 pid 不再是 运行。

有没有办法将两个语句合并为一个语句来避免错误?

编辑:我必须终止的进程使用临时文件;因此它必须关闭(而不仅仅是发出关闭信号)才能再次启动它。检查 kill 的 return 值没有帮助,因为这表明信号是否已成功传递。

实际上,没有原子终止和等待,因为它们是两个独立的系统调用。必须编写一些包装器来执行这两个函数。

如果不在意状态,

kill $PID 2> /dev/null
wait $PID 2> /dev/null

如果您确实关心状态,但不想要错误消息,请执行类似

的操作
if ! kill $PID 2> /dev/null; then
    # Error logic here
fi

两者的奇特方式是一个函数

killAndWait() {
    kill  2> /dev/null && wait  2> /dev/null
}

然后,做

killAndWait $PID

这不是单线的,但您是否愿意考虑通过短暂的休眠产生杀戮,然后在主线程中等待?类似于:

(sleep 1; kill $PID) &
wait $PID

这解决了您对 PID 在终止后被重用的担忧。即使您将 sleep 减少到更小的程度,它也会引入空闲时间,但它至少应该确保您 wait 在正确的进程上。

kill $PID
wait $PID

If the process exists immediately, the wait will fail, since the pid is not running anymore.

只要$PID真的指向shell的一个子进程,我不认为wait失败。我没有看到你的代码有错误。

实验:

bash-3.2$ while : ; do ls > /dev/null ; done &
[1] 44908
bash-3.2$ kill 44908
[1]+  Terminated: [...]
bash-3.2$ wait 44908
bash-3.2$ echo $?
143

143 是 SIGTERM 的 return 代码,因此 kill 按预期工作,并且 Bash 可以 wait 用于死进程。