51 lines
1.5 KiB
Bash
Executable File
51 lines
1.5 KiB
Bash
Executable File
#!/bin/bash
|
|
# Persistent VM stop — ACPI poweroff via QEMU monitor, then SIGTERM, then SIGKILL
|
|
# Kill swtpm after QEMU exits. Cleanup PID/sockets.
|
|
|
|
VMROOT=/home/aivanov/quickemu-win11-arm-lea
|
|
MONITOR_SOCKET="$VMROOT/windows-11-arm-lea-monitor.socket"
|
|
PIDFILE="$VMROOT/windows-11-arm-lea.pid"
|
|
|
|
# Step 1: Send ACPI poweroff via QEMU monitor
|
|
if [ -S "$MONITOR_SOCKET" ]; then
|
|
echo "system_powerdown" | socat - UNIX-CONNECT:"$MONITOR_SOCKET" - > /dev/null 2>&1
|
|
echo "ACPI poweroff sent, waiting 30s..."
|
|
for i in $(seq 1 30); do
|
|
if [ ! -f "$PIDFILE" ] || ! ps -p "$(cat "$PIDFILE" 2>/dev/null)" > /dev/null 2>&1; then
|
|
echo "QEMU exited gracefully"
|
|
exit 0
|
|
fi
|
|
sleep 1
|
|
done
|
|
fi
|
|
|
|
# Step 2: SIGTERM (10s more)
|
|
QEMU_PID=$(cat "$PIDFILE" 2>/dev/null)
|
|
if [ -n "$QEMU_PID" ] && ps -p "$QEMU_PID" > /dev/null 2>&1; then
|
|
echo "Still running, sending SIGTERM..."
|
|
kill "$QEMU_PID" 2>/dev/null
|
|
for i in $(seq 1 10); do
|
|
if ! ps -p "$QEMU_PID" > /dev/null 2>&1; then
|
|
echo "QEMU exited after SIGTERM"
|
|
break
|
|
fi
|
|
sleep 1
|
|
done
|
|
fi
|
|
|
|
# Step 3: SIGKILL
|
|
QEMU_PID=$(cat "$PIDFILE" 2>/dev/null)
|
|
if [ -n "$QEMU_PID" ] && ps -p "$QEMU_PID" > /dev/null 2>&1; then
|
|
echo "Still running, SIGKILL..."
|
|
kill -9 "$QEMU_PID" 2>/dev/null
|
|
sleep 2
|
|
fi
|
|
|
|
# Step 4: Kill swtpm
|
|
pkill -f "swtpm.*windows-11-arm-lea" 2>/dev/null
|
|
sleep 2
|
|
|
|
# Step 5: Cleanup
|
|
rm -f "$PIDFILE" "$VMROOT"/*.sock "$VMROOT"/*.socket 2>/dev/null
|
|
echo "VM stop complete"
|