如果我使用组合批量杀死子进程并等待它终止,我使用
kill $PID
wait $PID
如果该过程立即存在,wait
将失败,因为pid不再运行。
有没有办法将两个语句组合成一个语句以避免错误?
编辑:我必须杀死的进程使用临时文件;因此必须关闭(并且不仅仅是发信号关闭)再次启动它。检查kill
的返回值没有帮助,因为这表明信号是否已成功传送。
答案 0 :(得分:4)
这不是单行,但你是否愿意考虑通过短暂的睡眠产生杀死,然后在主线程中等待?类似的东西:
(sleep 1; kill $PID) &
wait $PID
这解决了您在kill后重用PID的问题。即使您将sleep
缩小到更小的值,它也会引入空闲时间,但它至少应该确保您wait
正确的过程。
答案 1 :(得分:0)
实际上,没有原子终止和等待,因为它们是两个独立的系统调用。必须编写一些包装器来执行这两个函数。
如果您不关心状态,
if ! kill $PID 2> /dev/null; then
# Error logic here
fi
如果你关心状态,但不想要错误信息,请执行类似
的操作killAndWait() {
kill $1 2> /dev/null && wait $1 2> /dev/null
}
两者的奇特方式是一个功能
killAndWait $PID
然后,做
#{FormGenerator.formItems[pdi].get(data.id).getData().label}
答案 2 :(得分:0)
kill $PID
wait $PID
如果进程立即存在,wait
将失败,因为 pid 不再运行。
只要 $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 的返回码,因此 kill
按预期工作,而 Bash 可以 wait
用于死进程。