jueves, 11 de febrero de 2016

Krab run

Dependiendo de la complejidad del sistema que estemos desarrollando, podemos toparnos con la necesidad de lanzar procesos varias veces y no saber si están siendo ejecutado o ya terminaron. Por ejemplo, un cron que se ejecuta cada una hora pero no queremos que se ejecute si el anterior pedido se encuentra en proceso actualmente.

Probablemente existan muchas f'órmulas para solucionar ésto como por ejemplo marcas al inicio del script que las borramos en la salida, pero también puede darse el caso de que el script aborte en plena ejecución dejando la marca.

En fin, despues de muchos intentos llegué a un pequeño script que llamé krun (Krab RUN) que comparto por si le interesa a alguien mas.
El script lo copié a /usr/bin/ y para ejecutar cualquier programa basta con poner: krun programa [parámetros] .

#!/bin/bash
# krun - Krab Run - Copyright 2015 Carlos Giurleo
# Este programa se distribuye bajo los terminos de la General Public License de GNU

if [ "${1}" = "" ]; then
        echo "krun - Krab Run - Copyright 2015 Carlos Giurleo"
        echo "Version: 20160110"
        echo "Use: $0 programa [parametros]"
        exit
fi
LOCK_FILE="/tmp/`echo -n ${0}${@} | md5sum | awk '{print $1}'`.lock"
if ! [ -e ${LOCK_FILE} ]; then
        echo -e $$ $0 $@ > ${LOCK_FILE}
fi
PATH=${PATH}":./"
export LOCK_FILE
flock -n ${LOCK_FILE} $@ && if [ -e ${LOCK_FILE} ]; then rm ${LOCK_FILE}; fi

El script genera en el /tmp un archivo MD5 .look relativo a la linea completa de ejecución. Dentro está el PID de ese krun el comando con sus parámetros.

Si se va a ejecutar un script y se quiere tener un loop constante pero modificable, se puede incluir dentro de dicho script un while de la siguiente manera:

while [ -e ${LOCK_FILE} ]; do

De esa manera cuando se elimine el archivo lock del tmp no se cumple la condición para el loop y sale del script.