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

관련 정보