internos - lista completa de comandos linux pdf
Script de Linux para verificar si el proceso se está ejecutando y actuar sobre el resultado (4)
Tengo un proceso que falla regularmente y a veces comienza instancias duplicadas.
Cuando ejecuto: ps x |grep -v grep |grep -c "processname"
: 2
Esto es normal ya que el proceso se ejecuta con un proceso de recuperación.
Si obtengo 0
, deseo comenzar el proceso si obtengo: 4
Deseo detener y reiniciar el proceso.
Lo que necesito es una forma de tomar el resultado de ps x |grep -v grep |grep -c "processname"
Luego configura una función simple de 3 opciones
ps x |grep -v grep |grep -c "processname"
if answer = 0 (start process & write NOK & Time to log /var/processlog/check)
if answer = 2 (Do nothing & write OK & time to log /var/processlog/check)
if answer = 4 (stot & restart the process & write NOK & Time to log /var/processlog/check)
El proceso se detiene con el killall -9 process
El proceso se inicia con el process -b -c /usr/local/etc
Mi problema principal es encontrar una forma de actuar sobre el resultado de ps x |grep -v grep |grep -c "processname"
.
Idealmente, me gustaría hacer que el resultado de esa grep sea una variable dentro del script con algo como esto:
process=$(ps x |grep -v grep |grep -c "processname")
Si es posible.
¡Adopté la solución @Jotne y funciono 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
Aquí hay un script que uso para monitorear si un proceso en un sistema se está ejecutando.
El script se almacena en crontab
y se ejecuta una vez por minuto.
#! /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 está bien.
*
Si el proceso ejecuta 2 o más, mata al último.
Una versión más simple. Esto solo prueba si el proceso se está ejecutando, y si no lo reinicia.
Simplemente prueba el indicador de salida $?
del programa pidof
. Será 0
de proceso en ejecución 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
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 extra de oscam1 con esta línea: /usr/local/bin/oscam1 -b -c /usr/local/etc/oscam1 -t /usr/local/tmp.oscam1
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 bajarlo a 2 procesos ...
Aparte de killall -9 oscam1
seguido por /usr/local/bin/oscam1 -b -c /usr/local/etc/oscam1 -t /usr/local/tmp.oscam1
, en *)
¿hay alguna forma mejor de separarlos? del proceso original? Entonces, ¿no habrá tiempo de inactividad?
Use Systemctl en Linux. Es una nueva forma de controlar las unidades y los servicios de SystemD. Obtenga más información aquí https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units