Inhaltsverzeichnis
Automatischer Neustart der dv_serial auf einem Banana Pi Pro
Warum diese Skripte?
Manchmal kann es unter verschiedenen Umständen zum Absturz der dv_serial kommen. Die Ursachen können vielfältig sein und werden hier nicht näher beleuchtet. Um dieses Problem zumindest automatisch zu beheben, sind nachstehende Scripte entstanden.
Voraussetzungen
Das Script setzt voraus, dass die dv_serial unter /home/bananapi/DV4mini gespeichert ist (sieht man, wenn man im Script den „PROG_PATH“ sich anschaut… kann an dieser Stelle an die eigene Installation geändert werden.
Skripte
/etc/init.d/dv_serial.sh
#!/bin/bash
### BEGIN INIT INFO
#
# Provides: dv_serial
# Required-Start: $remote_fs
# Required-Stop: $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: dv_serial initscript
#
### END INIT INFO
## Fill in name of program here.
PROG="dv_serial"
PROG_PATH="/home/bananapi/DV4mini/"
PROG_ARGS=""
PIDFILE="/var/run/dv_serial.pid"
USER="bananapi"
start() {
if [ -e $PIDFILE ]; then
## Program is running, exit with error.
echo "Error! $PROG is currently running!" 1>&2
exit 1
else
## Change from /dev/null to something like /var/log/$PROG if you want to save output.
cd $PROG_PATH
echo "******* RESTART of dv_serial *******" >> /var/log/dv_serial.log
sudo -u $USER /usr/bin/stdbuf -i0 -o0 -e0 ./$PROG $PROG_ARGS 2>&1 >> /var/log/dv_serial.log &
echo "$PROG started"
touch $PIDFILE
sleep 2
ionice --class 1 --pid="$(pidof dv_serial)"
renice -10 --pid "$(pidof dv_serial)"
fi
}
stop() {
if [ -e $PIDFILE ]; then
## Program is running, so stop it
echo "$PROG is running"
rm -f $PIDFILE
killall $PROG
echo "$PROG stopped"
else
## Program is not running, exit with error.
echo "Error! $PROG not started!" 1>&2
exit 1
fi
}
## Check to see if we are running as root first.
## Found at http://www.cyberciti.biz/tips/shell-root-user-check-script.html
if [ "$(id -u)" != "0" ]; then
echo "This script must be run as root" 1>&2
exit 1
fi
case "$1" in
start)
start
exit 0
;;
stop)
stop
exit 0
;;
reload|restart|force-reload)
stop
sleep 2
start
exit 0
;;
**)
echo "Usage: $0 {start|stop|reload}" 1>&2
exit 1
;;
esac
exit 0
### END
Jetzt noch mein „watchdog“ script, was ich unter /root/scripts/watchdog.sh laufen habe:
#!/bin/bash
if [ ! "$(pidof dv_serial)" ]
then
date >> /root/scripts/restart.log
rm /var/run/dv_serial.pid
/etc/init.d/dv_serial.sh start
fi
sleep 30
if [ ! "$(pidof dv_serial)" ]
then
date >> /root/scripts/restart.log
rm /var/run/dv_serial.pid
/etc/init.d/dv_serial.sh start
fi
### END
Crontab-Eintrag
Den Watchdog trägt man mit „sudo crontab -e“ in die Crontab des Root ein, sieht dann folgendermaßen aus:
# m h dom mon dow command
* * * * * /root/scripts/watchdog.sh
Das bewirkt nun, dass minütlich das Script aufgerufen wird, welches quasi 2 mal in der Minute (nach einer Pause von 30 Sekunden) prüft, ob der Prozess noch vorhanden ist… es wird also automatisch nach dem Start die dv_serial gestartet über den Watchdog.
Abschließendes
Möchte man das Script auf einem Raspberry Pi einsetzen, ist der Installationspfad und der Benutzer des Programmaufrufs auf „pi“ anzupassen (also die Stellen, wo bananapi steht, durch pi ersetzen).