杀死&等一步

时间:2015-06-10 07:56:00

标签: linux bash kill waitpid

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

kill $PID
wait $PID

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

有没有办法将两个语句组合成一个语句以避免错误?

编辑:我必须杀死的进程使用临时文件;因此必须关闭(并且不仅仅是发信号关闭)再次启动它。检查kill的返回值没有帮助,因为这表明信号是否已成功传送。

3 个答案:

答案 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 用于死进程。