Přijal jsem váš scénář pro mou situaci 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
Během testování jsem narazil na problém. Spustil jsem 3 další procesy oscam1 s tímto řádkem:/usr/local/bin/oscam1 -b -c /usr/local/etc/oscam1 -t /usr/local/tmp.oscam1
což mi zanechalo 8 procesů pro oscam1. problém je v tomto..Když spustím skript, zabije pouze 2 procesy najednou, takže bych ho musel spustit 3krát, abych ho dostal na 2 procesy.
Jiné než killall -9 oscam1
následuje /usr/local/bin/oscam1 -b -c /usr/local/etc/oscam1 -t /usr/local/tmp.oscam1
, v *)
existuje nějaký lepší způsob, jak zabít all kromě původního procesu? Takže by byly nulové prostoje?
Programy pro sledování, zda je v systému spuštěn proces.
Skript je uložen v crontab
a běží jednou za minutu.
Toto funguje, pokud proces není spuštěn nebo proces běží vícekrát:
#! /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
Pokud proces není nalezen, restartujte jej.
1
Pokud je proces nalezen, vše v pořádku.
*
Pokud proces běží 2 nebo více, ukončete poslední.
Jednodušší verze. Toto pouze otestuje, zda proces běží, a pokud ne, restartujte jej.
Pouze testuje výstupní příznak $?
z pidof
program. Bude to 0
procesu běží a 1
pokud ne.
#!/bin/bash
pidof amadeus.x86 >/dev/null
if [[ $? -ne 0 ]] ; then
echo "Restarting Amadeus: $(date)" >> /var/log/amadeus.txt
/etc/amadeus/amadeus.x86 &
fi
A konečně jedna vložka
pidof amadeus.x86 >/dev/null ; [[ $? -ne 0 ]] && echo "Restarting Amadeus: $(date)" >> /var/log/amadeus.txt && /etc/amadeus/amadeus.x86 &
To pak lze použít v crontab ke spuštění každou minutu takto:
* * * * * pidof amadeus.x86 >/dev/null ; [[ $? -ne 0 ]] && echo "Restarting Amadeus: $(date)" >> /var/log/amadeus.txt && /etc/amadeus/amadeus.x86 &
cccam oscam
Přijal jsem řešení @Jotne a funguje perfektně! Například pro mongodb server v mém NAS
#! /bin/bash
case "$(pidof mongod | wc -w)" in
0) echo "Restarting mongod:"
mongod --config mongodb.conf
;;
1) echo "mongod already running"
;;
esac