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