目前我做的:
while [ -d "/proc/$PID" ]; do
sleep 1
done
因为我不能使用
wait
,因为它是一个非子进程。
问题是
sleep
阻塞任何信号陷阱处理程序(例如SIGINT或SIGTERM)直到它不再休眠。所以每个信号平均会延迟0.5秒
我尝试使用
tail
而不是等待 PID,但它也会阻止陷阱处理程序(除非您在交互式 shell 中按 CTRL-C)。我尝试使用 pwait
/ pidwait
但同样的问题:当收到停止信号时它们不会退出。
那么有没有好的方法可以做到这一点,并且仍然能够处理停止信号?
解决方案很简单。我需要在等待所述 PID 的可执行文件的 PID 上调用
wait
,而不是在 PID 上调用 wait
。这允许在等待时调用信号陷阱。
例如:
pidwait "$PID" & wait $!
或:
tail --pid "$PID" -f /dev/null & wait $!
甚至可以通过等待睡眠来修复原始循环:
while [ -d "/proc/$PID" ]; do
sleep 1 & wait $!
done
这有点违反直觉,因为您正在等待已经在等待的东西,但事后看来这是有道理的。