Ho adottato il tuo copione per la mia situazione 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
Mentre stavo testando, mi sono imbattuto in un problema..ho avviato 3 processi extra di oscam1 con questa riga:/usr/local/bin/oscam1 -b -c /usr/local/etc/oscam1 -t /usr/local/tmp.oscam1
che mi ha lasciato con 8 processi per oscam1. il problema è questo..Quando eseguo lo script, uccide solo 2 processi alla volta, quindi dovrei eseguirlo 3 volte per ridurlo a 2 processi..
Diverso da killall -9 oscam1
seguito da /usr/local/bin/oscam1 -b -c /usr/local/etc/oscam1 -t /usr/local/tmp.oscam1
, in *)
c'è un modo migliore per uccidere tutto a parte il processo originale? Quindi non ci sarebbero tempi di inattività pari a zero?
Programmi per monitorare se un processo su un sistema è in esecuzione.
Lo script è memorizzato in crontab
e viene eseguito una volta al minuto.
Funziona se il processo non è in esecuzione o il processo è in esecuzione più volte:
#! /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
Se il processo non viene trovato, riavviarlo.
1
Se il processo viene trovato, tutto ok.
*
Se il processo ne esegue 2 o più, termina l'ultimo.
Una versione più semplice. Questo verifica solo se il processo è in esecuzione e, in caso contrario, riavvialo.
Testa solo il flag di uscita $?
dal pidof
programma. Sarà 0
del processo è in esecuzione e 1
in caso contrario.
#!/bin/bash
pidof amadeus.x86 >/dev/null
if [[ $? -ne 0 ]] ; then
echo "Restarting Amadeus: $(date)" >> /var/log/amadeus.txt
/etc/amadeus/amadeus.x86 &
fi
E finalmente, una riga
pidof amadeus.x86 >/dev/null ; [[ $? -ne 0 ]] && echo "Restarting Amadeus: $(date)" >> /var/log/amadeus.txt && /etc/amadeus/amadeus.x86 &
Questo può quindi essere utilizzato in crontab per essere eseguito ogni minuto in questo modo:
* * * * * pidof amadeus.x86 >/dev/null ; [[ $? -ne 0 ]] && echo "Restarting Amadeus: $(date)" >> /var/log/amadeus.txt && /etc/amadeus/amadeus.x86 &
cccam oscam
Ho adottato la soluzione @Jotne e funziona perfettamente! Ad esempio per il server mongodb nel mio NAS
#! /bin/bash
case "$(pidof mongod | wc -w)" in
0) echo "Restarting mongod:"
mongod --config mongodb.conf
;;
1) echo "mongod already running"
;;
esac