miércoles, 14 de mayo de 2014

Evitar que se solapen ejecuciones del Cron

Si tienes un script en php que se ejecuta en el cron cada 10 minutos, por ejemplo, y la ejecución puede demorarse durante de mas de esos 10 minutos, al final acabarán solapándose dos ejecuciones del script, cosa que no es recomendable.

Respuesta corta:

#!/bin/bash
PHP_EXECUTABLE="/usr/bin/php"
SCRIPT_DIRECTORY="/home/alberto"
SCRIPT_NAME="test.php"
if ps -fea | grep $SCRIPT_NAME | grep -v grep
then
date
echo "Overlaping message end"
else
cd $SCRIPT_DIRECTORY
$PHP_EXECUTABLE $SCRIPT_DIRECTORY"/"$SCRIPT_NAME > /dev/null 2>&1
fi

Respuesta larga:

La típica solución que hemos usado todos es usar un fichero de bloqueo, de manera que si existe dicho fichero no se ejecuta nada. Esto tiene el inconveniente de que hay que asegurarse que el fichero se borra, si el script termina con un error, o se va a luz, o cae un dinosaurio sobre el servidor el fichero no se borrará y no se producirá ninguna ejecución futura del script.

El otro enfoque es usar el comando ps, que da información de los procesos activos, después filtramos (comando grep) por aquellos que contengan el nombre de nuestro script, y volvemos a filtrar para eliminar las referencias a grep. Esto último es debido a que al buscar con 'grep nombredelproceso' estamos generando un proceso llamado 'grep nombredelproceso', que coincidirá con la cadena 'nombredelproceso'.

Respuesta más larga: El blog de Berriart

 

0 comentarios:

Publicar un comentario