Libvirtはフックフォークを可能にします。

Libvirtはフックフォークを可能にします。

次の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として印刷して返します。

関連情報