#!/bin/sh PIDFILE=$STATE_DIR/qemu-$MACHINE-$SCHEME.pid CONTROLPIDFILE=$STATE_DIR/qemu-$MACHINE-$SCHEME.control.pid if [ ! -e $PIDFILE ]; then echo "No pid file $PIDFILE" >&2 exit 1 fi pid=$(cat $PIDFILE) if [ -z "$QEMU_COMMAND" ]; then QEMU_COMMAND=qemu fi if ! pidof $QEMU_COMMAND | grep -q $pid; then echo "stale pid" >&2 exit fi forcekill() { # Force stop qemu. kill -9 $pid echo "killed qemu (pid $pid)" # wait for sockets to close etc sleep 60 } # Signal qemu control process to save state. if [ -e $CONTROLPIDFILE ]; then controlpid=$(cat $CONTROLPIDFILE) rm -f $CONTROLPIDFILE if ps ax | grep -q $controlpid'[ ]'; then kill -USR1 $controlpid || true echo "sent control process (pid $controlpid) save and cleanup signal" # Wait for it to stop qemu. count=0 while pidof $QEMU_COMMAND | grep -q $pid; do count=$(expr $count + 1) if [ $count -gt 100 ]; then echo "qemu is not stopping..." >&2 forcekill exit fi sleep 1 done # wait for sockets to close etc sleep 60 exit else echo "stale control pid" >&2 fi fi forcekill