10

我一直在使用 Bash 等到 PID 不再存在。我试过了

#!/bin/bash
while [ kill -0 PID > /dev/null 2>&1 ]; do
    //code to kill process
done
//code to execute after process is dead

#!/bin/bash
until [ ! kill -0 PID > /dev/null 2>&1 ]; do
    //code to kill process
done
//code to execute after process is dead

这两个示例要么无法工作,要么在进程结束后继续循环。我做错了什么?

4

2 回答 2

18

你应该简单地做:

while kill -0 $PID >/dev/null 2>&1
do
    # Code to kill process
done

循环条件测试最后一个命令的退出状态——在本例中为kill. 该-0选项(在问题中使用)实际上不会向进程发送任何信号,但它会检查是否可以发送信号 - 如果进程不再存在,则无法发送。(请参阅kill()函数的 POSIX 规范和 POSIXkill实用程序。)

'last' 的意义在于你可以这样写:

while sleep 1
      echo Testing again
      kill -0 $PID >/dev/null 2>&1
do
    # Code to kill process
done

kill这也测试了(并且kill单独)的退出状态。

于 2012-07-11T05:13:29.057 回答
4

你也可以在 unixes 中使用 procfs(几乎所有除了 mac os)

while test -d /proc/$PID; do
     kill -$SIGNAL $PID
     # optionally
     sleep 0.2
done
于 2013-06-14T16:17:25.437 回答