我在-daemonize
模式下运行 QEMU 虚拟机,然后生成一个任意前台(可能是交互式)进程,用于与 QEMU 实例进行交互。通常,一旦前台进程完成,我会通过 pidfile 清理 QEMU 实例:
qemu-system ... -pidfile ./qemu.pid -daemonize
/my/custom/interactive/process
pkill -F ./qemu.pid
但是在某些情况下,QEMU 可以独立退出并且我的前台进程继续运行。但我想阻止它以防万一。所以我的自定义交互过程的行为应该是这样的:
tail -f --pid=./qemu.pid /dev/null
我怎样才能很好地做到这一点?也许有某种类似超时的包装器,所以我可以运行类似的东西:
trackpid ./qemu.pid /my/custom/interactive/process
您可以轮询 qemu 进程是否消失,并在它消失时提前终止。这是经过快速测试的代码,尤其是未使用
qemu-system
.它也有很多。您可以删除这些
#DEBUG
行,但如果您有兴趣了解它们是如何连接在一起的,请取消注释并将程序输出与代码进行比较。最后我得到了以下代码:
花括号中的脚本实际上是在后台运行的 pidfile 监视器。一旦 pid 消失,监控终止当前进程组。我使用
kill -INT 0
它是因为它为我提供了最可靠和最干净的结果。其他选择是:
kill -- 0
(使用 TERM 信号终止,不会正确终止交互过程)kill -INT $$
(仅杀死 shell 进程,不会正确终止交互进程)kill -- -$$
(杀死由 shell 的 pid 表示的进程组,并不总是正常工作,我假设由于调用sudo
作为进程组负责人)pkill -P $$
(仅杀死子进程,实际上可以,但我更喜欢使用内置的 shell 并依赖 Ctrl-C 处理行为)。另一点是,如果我的交互过程已自行完成,我必须终止监视进程以避免进一步推断退出和清理脚本。