如果我有以下 Libvirt 钩子/etc/libvirt/hooks/qemu.d/hook.sh
#!/usr/bin/env bash
if [[ $1 == "SEARCH_FOR_ME" ]]; then
while true; do
sleep 1
done
fi
bash /etc/libvirt/hooks/qemu.d/hook.sh SEARCH_FOR_ME &
disown $!
touch /tmp/test123
exit 0
现在,当我启动任何虚拟机时,这个钩子就会被调用,我期望发生的情况是,将生成一个新进程并与虚拟机一起运行。
实际发生的情况是 libvirt 由于某种原因知道分叉进程仍在运行。注意/tmp/test123
正在创建。
原来的 bash 脚本似乎被暂停了。
2438 root 20 0 0 0 0 Z 0.0 0.0 0:00.00 bash
2439 root 20 0 4396 3200 2944 S 0.0 0.0 0:00.04 bash /etc/libvirt/hooks/qemu.d/hook.sh SEARCH_FOR_ME
此外,在我的终端中运行相同的挂钩时,我无法观察到相同的行为。
nohup 的工作方式相同,但不能解决此问题。
我的系统:
Artix Linux (OpenRC 0.53)
Hyprland WM (Wayland)
Libvirtd + Virt Manager
答案1
好吧,我在 bash 中找不到解决方案。用 python 制作了一个快速包装器,可以作为一个很好的替代品。
import subprocess
import sys
args = sys.argv
args.pop(0)
proc = subprocess.Popen(args, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
print(proc.pid)
称为:
/usr/bin/python ./wrapper.py bash /etc/libvirt/hooks/qemu.d/hook.sh SEARCH_FOR_ME
请注意,此包装器通过将 PID 打印到 stdout 来返回 PID。