Libvirt 允许 hook to fork

Libvirt 允许 hook to fork

如果我有以下 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。

相关内容