如何等待一个非子进程?

问题描述 投票:0回答:1

目前我做的:

while [ -d "/proc/$PID"  ]; do
  sleep 1
done

因为我不能使用

wait
,因为它是一个非子进程。

问题是

sleep
阻塞任何信号陷阱处理程序(例如SIGINT或SIGTERM)直到它不再休眠。所以每个信号平均会延迟0.5秒

我尝试使用

tail
而不是等待 PID,但它也会阻止陷阱处理程序(除非您在交互式 shell 中按 CTRL-C)。我尝试使用
pwait
/
pidwait
但同样的问题:当收到停止信号时它们不会退出。

那么有没有好的方法可以做到这一点,并且仍然能够处理停止信号?

bash process wait pid sigterm
1个回答
0
投票

解决方案很简单。我需要在等待所述 PID 的可执行文件的 PID 上调用

wait
,而不是在 PID 上调用
wait
。这允许在等待时调用信号陷阱。

例如:

pidwait "$PID" & wait $!

或:

tail --pid "$PID" -f /dev/null & wait $!

甚至可以通过等待睡眠来修复原始循环:

while [ -d "/proc/$PID"  ]; do
  sleep 1 & wait $!
done

这有点违反直觉,因为您正在等待已经在等待的东西,但事后看来这是有道理的。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.