He adoptado tu guión para mi situación 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
Mientras estaba probando, me encontré con un problema. Comencé 3 procesos adicionales de oscam1 con esta línea:/usr/local/bin/oscam1 -b -c /usr/local/etc/oscam1 -t /usr/local/tmp.oscam1
lo que me dejó con 8 procesos para oscam1. el problema es este... Cuando ejecuto el script, solo mata 2 procesos a la vez, así que tendría que ejecutarlo 3 veces para reducirlo a 2 procesos...
Aparte de killall -9 oscam1
seguido de /usr/local/bin/oscam1 -b -c /usr/local/etc/oscam1 -t /usr/local/tmp.oscam1
, en *)
¿Hay alguna forma mejor de matar a todos además del proceso original? ¿Entonces no habría tiempo de inactividad?
Programas para monitorear si un proceso en un sistema se está ejecutando.
El script se almacena en crontab
y se ejecuta una vez cada minuto.
Esto funciona si el proceso no se está ejecutando o se está ejecutando varias veces:
#! /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 no se encuentra el proceso, reinícielo.
1
Si se encuentra el proceso, todo ok.
*
Si el proceso ejecuta 2 o más, elimine el último.
Una versión más simple. Esto solo prueba si el proceso se está ejecutando y, si no, reinícielo.
Simplemente prueba la bandera de salida $?
del pidof
programa. Será 0
del proceso se está ejecutando y 1
si no.
#!/bin/bash
pidof amadeus.x86 >/dev/null
if [[ $? -ne 0 ]] ; then
echo "Restarting Amadeus: $(date)" >> /var/log/amadeus.txt
/etc/amadeus/amadeus.x86 &
fi
Y por último, una sola línea
pidof amadeus.x86 >/dev/null ; [[ $? -ne 0 ]] && echo "Restarting Amadeus: $(date)" >> /var/log/amadeus.txt && /etc/amadeus/amadeus.x86 &
Esto se puede usar en crontab para ejecutar cada minuto así:
* * * * * pidof amadeus.x86 >/dev/null ; [[ $? -ne 0 ]] && echo "Restarting Amadeus: $(date)" >> /var/log/amadeus.txt && /etc/amadeus/amadeus.x86 &
cccam oscam
¡Adopté la solución @Jotne y funciona perfectamente! Por ejemplo, para el servidor mongodb en mi NAS
#! /bin/bash
case "$(pidof mongod | wc -w)" in
0) echo "Restarting mongod:"
mongod --config mongodb.conf
;;
1) echo "mongod already running"
;;
esac