一步杀死并等待
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
用于死进程。
如果我使用组合批量杀死一个子进程并等待它终止,我使用
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
用于死进程。