Spiga

Controlar de forma automática si un proceso se está ejecutando

Hola!

El otro día tuve que escribir un script que me ayudara a controlar si un proceso de la máquina se está ejecutando y así poder iniciarlo si se hubiera muerto, y, aunque es algo sencillo, me parece interesante compartirlo.

Bien, supongamos que se trata de controlar un programa en ruby, "update_feeds", que debe estar ejecutándose continuamente. Si quisiéramos comprobar si el programa está en ejecución podríamos usar la orden ps -ef | grep update_feeds:
ps -ef muestra todos los procesos del sistema, y con grep hacemos que sólo se muestren las líneas que contengan la cadena update_feeds.


Como vemos en la imagen, se muestran 2 procesos: un proceso ruby ejecutando el script que se desea controlar y el proceso grep que acabamos de lanzar. Como sólo nos interesa el primero, podemos volver a usar grep para que sólo se muestren los procesos ruby:


Si la salida de la orden anterior se la pasamos a wc nos mostrará el número de líneas de la salida (en la primera columna), el número de palabras y de bytes:


Como el dato que nos interesa es el del número de líneas, podemos manipular la salida con la orden awk:


Bien, con esa combinación de órdenes podemos saber si el programa a controlar se está ejecutando o no, en función de si el valor obtenido es un 1 o un 0. Escribiendo un simple script podemos automatizar esta tarea. Aquí tienes un ejemplo de prueba que muestra "ok" por pantalla si el proceso está funcionando y lo arranca en caso contrario:

#!/bin/bash

cont=0
cont=`ps -ef | grep nombre_programa | grep ruby | wc | awk ' {print $1}'`
echo $cont
if [ $cont -eq 1 ]
then
echo "ok"
else
/usr/local/bin/ruby /....../nombre_programa
fi

Para poder probar el script debes darle permisos de ejecución con la orden chmod. Y por último, cuando lo hayas personalizado, debemos hacer que se ejecute periódicamente. Si, por ejemplo, queremos que una vez cada hora compruebe si el proceso está ejecutándose, podemos copiar el script de control al directorio /etc/cron.hourly. (Más info sobre cron)

Saludos!

2 comentarios:

  Isaac

14 de enero de 2013, 4:09

Dos años y pico despues vengo para darte las gracias, me ha servido de ayuda ;)

  Jesús M.

14 de enero de 2013, 7:54

Gracias por el comentario, Isaac. Me alegro de que te sirviera de ayuda.

Un saludo!