放入我的 2c,我们可以将 Teixeira 的解决方案归结为:
try_wait() {
# Usage: [PID]...
for ((i = 0; i < $#; i += 1)); do
kill -0 $@ && sleep 0.001 || return 0
done
return 1 # timeout or no PIDs
} &>/dev/null
Bashsleep
接受小数秒,并且 0.001s = 1 ms = 1 KHz = 充足的时间。但是,UNIX 在文件和进程方面没有漏洞。try_wait
收效甚微。
$ cat &
[1] 16574
$ try_wait %1 && echo 'exited' || echo 'timeout'
timeout
$ kill %1
$ try_wait %1 && echo 'exited' || echo 'timeout'
exited
我们必须回答一些棘手的问题才能走得更远。
为什么wait
没有超时参数?也许是因为timeout
,kill -0
和命令可以wait
更wait -n
准确地告诉机器我们想要什么。
为什么首先wait
内置到 Bash 中,所以这timeout wait PID
不起作用?也许只有这样 Bash 才能实现正确的信号处理。
考虑:
$ timeout 30s cat &
[1] 6680
$ jobs
[1]+ Running timeout 30s cat &
$ kill -0 %1 && echo 'running'
running
$ # now meditate a bit and then...
$ kill -0 %1 && echo 'running' || echo 'vanished'
bash: kill: (NNN) - No such process
vanished
无论是在物质世界还是在机器中,因为我们需要一些地面来运行,我们也需要一些地面来等待。