【问题标题】:kill & wait in one step杀戮和等待
【发布时间】:2015-08-25 08:31:18
【问题描述】:

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

kill $PID
wait $PID

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

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

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

【问题讨论】:

  • 您的wait 的目的是什么?你真正想做什么?
  • 如果您想按顺序执行命令,最好查看$$ ; || etc. 否则,也许while 循环可以帮助您。 while [ $(kill ${PID}) ]; do "nothing" ;done
  • @SigveKarolius 错了。 kill $PID 立即返回,无论作业是否实际被杀死。只需编写一个简单的脚本来捕获和忽略SIGINT,然后看看kill 是如何工作的(它会返回0,虽然工作没有被杀死)。
  • 关于你想要做什么:你为什么不每次都使用一个唯一的临时文件? (查看mktemp。)
  • 另外,一个不太安全的方法是简单地检查 PID 是否仍然存在。

标签: linux bash kill waitpid


【解决方案1】:

它不是单行的,但你愿意考虑用短暂的睡眠来产生杀戮,然后在主线程中等待吗?比如:

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

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

【讨论】:

  • 没有我希望的那么优雅,但是一个有趣的想法!
【解决方案2】:

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

如果你不在乎状态,

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

如果您确实关心状态,但不想收到错误消息,请执行以下操作

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

两者的奇特方式是函数

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

那么,做

killAndWait $PID

【讨论】:

  • 它们可能是两个独立的系统调用,但在系统调用级别,wait() 是对您刚刚杀死的进程执行的有效且预期的事情。不过,我无法说出 killwait 在 Bash 中的语义。
【解决方案3】:
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 处理死进程。

【讨论】:

    猜你喜欢
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 2012-09-22
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多