I threw this service monitoring script together because occasionally the OpenMCU-ru process in the developmental versions can crash out on my Ubuntu Server from time to time, so I wanted it to auto-restart. The script could easily be modified and used for any other service you like, but it was written specifically for OpenMCU-ru and Debian based operating systems.
There are two pieces to this puzzle (which makes for an awfully pathetic and simplistic puzzle), the “/etc/init.d/mcu-monitor” startup script to run the monitoring script as a daemon and the “/usr/local/bin/mcu-monitor.sh” monitoring script itself, both are fairly simple and straight forward.
As usual, to run this service at startup you can issue:
update-rc.d mcu-monitor defaults
Download the /etc/init.d/mcu-monitor startup script here.
#!/bin/bash
# OpenMCU-ru process monitor startup script
# Author: Nathan Thomas
# Date: 04/14/2015
#
### BEGIN INIT INFO
# Provides: mcu-monitor
# Required-Start: $network $syslog $named $local_fs $remote_fs
# Required-Stop: $network $syslog $named $local_fs $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# X-Interactive: true
# Short-Description: Start/stop OpenMCU-ru process monitor daemon
### END INIT INFO
PROG=mcu-monitor
DESC="Auto restarts the OpenMCU-ru service upon failure"
HOME_DIR=/usr/local/bin
DAEMON=${HOME_DIR}/${PROG}.sh
PIDFILE=/var/run/${PROG}.pid
pscheck() { # return number of processes
echo "$( ps aux | grep "${PROG}.sh" | grep -cv "grep" 2>&1 )"
return 0
}
pidsmatch() { # do the curtains match the drapes?
if [ -e $PIDFILE ] ; then # if pidfile exists
if [ "$( pscheck )" -eq "1" ] ; then # if num procs=1
if [ "$( ps aux | grep "${PROG}.sh" | grep -v "grep" | awk '{ print $2 }' )" -eq "$( cat ${PIDFILE} )" ] ; then # compare pids
echo "yes"
return 0
fi
elif [ "$( pscheck )" -gt "1" ] ; then
return 1 # Hmm...multiple procs, we've got a problem
else
echo "no"
return 0
fi
else
return 1
fi
}
rmpid() { # say bye bye to mr piddlesworth
if [ -e $PIDFILE ] ; then
rm -f $PIDFILE 2>&1
if [ "$?" -ne "0" ] ; then
return 1
fi
fi
return 0
}
killpids() { # if procCount>=1, squash em
if [ "$( pscheck )" -ge "1" ] ; then
kill $( pgrep "${PROG}.sh" 2>&1 ) 2>&1
if [ "$?" -ne "0" ] ; then
return 1
fi
fi
return 0
}
start() {
rmpid # dump the pidfile
killpids # not kids
# Start the service
echo -n $"Starting ${PROG} service: "
start-stop-daemon --start --chuid root --pidfile $PIDFILE --chdir $HOME_DIR --background --make-pidfile --exec $DAEMON || return 1 2>&1
echo $"OK"
return 0
}
stop() {
echo -n $"Stopping ${PROG} service: "
start-stop-daemon --stop --pidfile $PIDFILE || return 1 2>&1
rmpid # dump the pidfile
if [ "$?" -eq "0" -a "$( pscheck )" -ne "0" ] ; then # if pidfile is gone and somehow procs still alive
killpids # not kids
if [ "$?" -ne "0" ] ; then
echo $"FAILED"
return 1
fi
fi
echo $"OK"
return 0
}
restart() {
stop && start
}
status() {
if [ "$( pscheck )" -eq "1" -a "$( pidsmatch )" == "yes" ] ; then
echo $"${PROG} (pid $( cat $PIDFILE )) is running"
elif [ "$( pscheck )" -eq "1" -a "$( pidsmatch )" == "no" ] ; then
echo $"Strange, ${PROG} is running, but PID doesn't match pidfile, fixing..."
restart
elif [ "$( pscheck )" -gt "1" ] ; then
echo $"Multiple instances of ${PROG} running, fixing..."
restart
else
echo $"${PROG} is stopped"
fi
return 0
}
case "$1" in
'start')
start
;;
'stop')
stop
;;
'restart')
restart
;;
'status')
status
;;
*)
echo $"Usage: $0 {start|stop|restart|status}"
exit 1
;;
esac
Download the /usr/local/bin/mcu-monitor.sh script here.
#!/bin/bash
# Auto restart OpenMCU-ru when it crashes
# Author: Nathan Thomas
# Date: 04/14/2015
while true
do
unset var
var=$( ps aux | grep "openmcu-ru" | grep -cv "grep" 2>&1 )
if [ "${var}" -eq "1" ] ; then
# It's aliiiiiiive...do nothing (bitchslap)
:
elif [ "${var}" -gt "1" ] ; then
# Hmm, multiple instances but why? Comment out if your debugging OpenMCU
# and there's a legitimate reason to have multiple processes running simultaneously
# Otherwise, Squish bug!
kill $( pgrep "openmcu-ru" 2&>1 ) 2&>1
/usr/bin/service openmcu-ru start 2>&1
else
# Balls, it's dead
/usr/bin/service openmcu-ru start 2>&1
fi
sleep .5
done
