3b9626b2dad785e7601ea8fdcbba0cea8b8ace39
[tests.git] / system / template-qemu / qemu-kill-node
1 #!/bin/sh
2 # $Id$
3 COMMAND=$(basename $0)
4 cd $(dirname $0)
5 THISNODE=$(basename $(pwd -P) | sed -e s,qemu-,,)
6 cd ..
7
8 # somehow qemu-system-x86_64 show up in pgrep as qemu-system-x86
9 COMMANDS_TO_KILL="qemu qemu-system-x86_64 qemu-system-x86"
10
11 function usage () {
12     echo "Usage: $COMMAND -l"
13     echo "  lists current qemu processes"
14     echo "usage: $COMMAND hostname"
15     echo "  kill qemu instance for that node"
16     echo "usage: $COMMAND this"
17     echo "  kill qemu instance that was started in this directory"
18     echo "usage: $COMMAND"
19     echo "  kill all instances of [$COMMANDS_TO_KILL]"
20     exit 1
21 }
22
23 function list_pids () {
24     hostnames="$@"
25     if [[ -n "$hostnames" ]] ; then
26         for hostname in $hostnames; do
27             [ $hostname == this ] && hostname=$THISNODE
28             nodedir=qemu-$hostname
29             cat $nodedir/qemu.pid 2> /dev/null
30         done
31     else
32         for command in $COMMANDS_TO_KILL; do
33             pgrep -x $command
34         done
35     fi
36 }
37
38 function kill_from_file () {
39     file=$1; shift
40     if [ -f $file ] ; then
41         pid=$(cat $file)
42         echo Killing $pid
43         kill $pid
44         mv $file $file.killed
45     else
46         echo "Could not find file $file - that qemu was killed already"
47     fi
48 }    
49
50 function kill_pids () {
51     hostnames="$@"
52     if [[ -n "$hostnames" ]] ; then
53         for hostname in $hostnames; do
54             [ $hostname == this ] && hostname=$THISNODE
55             nodedir=qemu-$hostname
56             kill_from_file $nodedir/qemu.pid
57         done
58     else
59         pids=$(list_pids)
60         if [ -n "$pids" ] ; then
61             echo "Killing all processes matching $COMMANDS_TO_KILL"
62             for pid in $pids; do
63                 echo Killing $pid
64                 kill $pid
65             done
66         else
67             echo "No process found that match $COMMANDS_TO_KILL"
68         fi
69     fi
70 }
71
72 function show_pids () {
73     pids=$(list_pids "$@")
74     if [ -n "$pids" ] ; then
75         ps $pids | grep -v $COMMAND || echo Nothing to show
76     else
77         echo Nothing to show
78     fi
79 }
80
81 function main () { 
82     while getopts "lk" opt; do
83         case $opt in
84             l) OPT_LIST=true ;;
85             *) usage ;;
86         esac
87     done
88     shift $(($OPTIND -1))
89
90     # listing
91     if [ -n "$OPT_LIST" ] ; then
92         show_pids "$@"
93         exit 0
94     fi
95
96     kill_pids "$@"
97 }
98
99 main "$@"