aboutsummaryrefslogtreecommitdiff
path: root/etc/private/vm-stop
blob: cf64deec4c61f900477f73a4edd84c41104f1942 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#! /usr/bin/env bash

# Stop virtual machine started with vm-start.
#
usage="usage: $0 <pid-file> <monitor-socket>"

trap "{ exit 1; }" ERR
set -o errtrace # Trap in functions.

function info () { echo "$*" 1>&2; }
function error () { info "$*"; exit 1; }


if [ -z "$1" -o ! -f "$1" ]; then
  error "missing or invalid PID file"
fi

pid="$(sed -nr -e 's/([0-9]+)/\1/p' "$1")"

if [ -z "$pid" ]; then
  error "PID file $1 does not contain valid PID"
fi

if [ -z "$2" -o ! -S "$2" ]; then
  error "missing or invalid monitor socket"
fi

mon="$2"

echo system_powerdown | socat - "UNIX-CONNECT:$mon" >/dev/null

# An alternative way to implement this would be to connect a pipe to the
# monitor socket and wait for it to be closed.
#
while [ -e "/proc/$pid" ]; do
  sleep 0.2
done