다음 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으로 인쇄하여 반환합니다.