Ich habe dein Skript für meine Situation übernommen Jotne.
#! /bin/bash
logfile="/var/oscamlog/oscam1check.log"
case "$(pidof oscam1 | wc -w)" in
0) echo "oscam1 not running, restarting oscam1: $(date)" >> $logfile
/usr/local/bin/oscam1 -b -c /usr/local/etc/oscam1 -t /usr/local/tmp.oscam1 &
;;
2) echo "oscam1 running, all OK: $(date)" >> $logfile
;;
*) echo "multiple instances of oscam1 running. Stopping & restarting oscam1: $(date)" >> $logfile
kill $(pidof oscam1 | awk '{print $1}')
;;
esac
Beim Testen bin ich auf ein Problem gestoßen. Ich habe 3 zusätzliche Prozesse von oscam1 mit dieser Zeile gestartet:/usr/local/bin/oscam1 -b -c /usr/local/etc/oscam1 -t /usr/local/tmp.oscam1
was mich mit 8 prozess für oscam1 zurückließ. Das Problem ist folgendes:Wenn ich das Skript ausführe, tötet es nur 2 Prozesse gleichzeitig, also müsste ich es 3 Mal ausführen, um es auf 2 Prozesse zu reduzieren..
Außer killall -9 oscam1
gefolgt von /usr/local/bin/oscam1 -b -c /usr/local/etc/oscam1 -t /usr/local/tmp.oscam1
, in *)
Gibt es eine bessere Möglichkeit, abgesehen vom ursprünglichen Prozess zu killall? Es gäbe also keine Ausfallzeit?
Programme zur Überwachung, ob ein Prozess auf einem System läuft.
Skript wird in crontab
gespeichert und läuft einmal pro Minute.
Dies funktioniert, wenn der Prozess nicht ausgeführt wird oder der Prozess mehrmals ausgeführt wird:
#! /bin/bash
case "$(pidof amadeus.x86 | wc -w)" in
0) echo "Restarting Amadeus: $(date)" >> /var/log/amadeus.txt
/etc/amadeus/amadeus.x86 &
;;
1) # all ok
;;
*) echo "Removed double Amadeus: $(date)" >> /var/log/amadeus.txt
kill $(pidof amadeus.x86 | awk '{print $1}')
;;
esac
0
Wenn der Prozess nicht gefunden wird, starten Sie ihn neu.
1
Wenn Prozess gefunden wird, alles ok.
*
Wenn 2 oder mehr Prozesse laufen, beenden Sie den letzten.
Eine einfachere Version. Testen Sie einfach, ob der Prozess läuft, und starten Sie ihn neu, wenn nicht.
Es testet nur das Exit-Flag $?
ab pidof
Programm. Es wird 0
sein des Prozesses läuft und 1
wenn nicht.
#!/bin/bash
pidof amadeus.x86 >/dev/null
if [[ $? -ne 0 ]] ; then
echo "Restarting Amadeus: $(date)" >> /var/log/amadeus.txt
/etc/amadeus/amadeus.x86 &
fi
Und zuletzt ein Einzeiler
pidof amadeus.x86 >/dev/null ; [[ $? -ne 0 ]] && echo "Restarting Amadeus: $(date)" >> /var/log/amadeus.txt && /etc/amadeus/amadeus.x86 &
Dies kann dann in crontab verwendet werden, um jede Minute wie folgt auszuführen:
* * * * * pidof amadeus.x86 >/dev/null ; [[ $? -ne 0 ]] && echo "Restarting Amadeus: $(date)" >> /var/log/amadeus.txt && /etc/amadeus/amadeus.x86 &
cccam oscam
Ich habe die @Jotne-Lösung übernommen und funktioniert perfekt! Zum Beispiel für den Mongodb-Server in meinem NAS
#! /bin/bash
case "$(pidof mongod | wc -w)" in
0) echo "Restarting mongod:"
mongod --config mongodb.conf
;;
1) echo "mongod already running"
;;
esac