J'ai adopté votre script pour ma situation 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
Pendant que je testais, j'ai rencontré un problème. J'ai démarré 3 processus supplémentaires d'oscam1 avec cette ligne :/usr/local/bin/oscam1 -b -c /usr/local/etc/oscam1 -t /usr/local/tmp.oscam1
ce qui m'a laissé avec 8 processus pour oscam1. le problème est le suivant..Quand j'exécute le script, il ne tue que 2 processus à la fois, donc je devrais l'exécuter 3 fois pour le réduire à 2 processus..
Autre que killall -9 oscam1
suivi de /usr/local/bin/oscam1 -b -c /usr/local/etc/oscam1 -t /usr/local/tmp.oscam1
, en *)
existe-t-il un meilleur moyen de tout tuer en dehors du processus d'origine ? Il n'y aurait donc aucun temps d'arrêt ?
Programmes pour surveiller si un processus sur un système est en cours d'exécution.
Le script est stocké dans crontab
et s'exécute une fois par minute.
Cela fonctionne si le processus n'est pas en cours d'exécution ou si le processus s'exécute plusieurs fois :
#! /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
Si le processus n'est pas trouvé, redémarrez-le.
1
Si le processus est trouvé, tout va bien.
*
Si processus en cours d'exécution 2 ou plus, tuez le dernier.
Une version simplifiée. Cela teste simplement si le processus est en cours d'exécution, et sinon, redémarrez-le.
Il teste juste le drapeau de sortie $?
à partir du pidof
programme. Ce sera 0
du processus est en cours d'exécution et 1
sinon.
#!/bin/bash
pidof amadeus.x86 >/dev/null
if [[ $? -ne 0 ]] ; then
echo "Restarting Amadeus: $(date)" >> /var/log/amadeus.txt
/etc/amadeus/amadeus.x86 &
fi
Et enfin, une ligne
pidof amadeus.x86 >/dev/null ; [[ $? -ne 0 ]] && echo "Restarting Amadeus: $(date)" >> /var/log/amadeus.txt && /etc/amadeus/amadeus.x86 &
Cela peut ensuite être utilisé dans crontab pour s'exécuter toutes les minutes comme ceci :
* * * * * pidof amadeus.x86 >/dev/null ; [[ $? -ne 0 ]] && echo "Restarting Amadeus: $(date)" >> /var/log/amadeus.txt && /etc/amadeus/amadeus.x86 &
cccam oscam
J'ai adopté la solution @Jotne et fonctionne parfaitement ! Par exemple pour le serveur mongodb dans mon NAS
#! /bin/bash
case "$(pidof mongod | wc -w)" in
0) echo "Restarting mongod:"
mongod --config mongodb.conf
;;
1) echo "mongod already running"
;;
esac