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