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).