#!/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"