GNU/Linux >> Tutoriales Linux >  >> Linux

Script de Linux para verificar si el proceso se está ejecutando y actuar sobre el resultado

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

Linux
  1. Cómo verificar la versión del sistema operativo y Linux

  2. ¿El resultado de Ls *, Ls ** y Ls ***?

  3. Linux:¿cómo obtener la hora del reloj de pared de un proceso en ejecución?

  4. Comando de Linux para verificar si un script de shell se está ejecutando o no

  5. Cómo verificar si existe un grupo y agregarlo si no existe en Linux Shell Script

Cómo verificar todos los servicios en ejecución en Linux

Cómo verificar la complejidad de la contraseña en Linux

Cómo verificar el nivel de ejecución en Linux

Cómo encontrar y matar procesos en ejecución en Linux

Comprobar la zona horaria en Linux

Cómo encontrar el PID y PPID de un proceso en Linux