Pregunta

Saludos a todos. Soy la creación de una tarea programada para ejecutar un script bash, y me preocupa que el siguiente puede comenzar antes de que termine la anterior. Un poco de googling revela que en una forma popular para hacer frente a esto es el comando flock, que se utiliza de la siguiente manera:

flock -n lockfile myscript.sh
if [ $? -eq 1 ]; then
    echo "Previous script is still running!  Can't execute!"
fi

Esto funciona muy bien. Sin embargo, ¿qué hago si quiero comprobar el código de salida de myscript.sh? Cualquiera que sea el código de salida se devuelve será sobrescrita por la flock, así que no tengo forma de saber si se ha ejecutado correctamente o no.

¿Fue útil?

Solución

Parece que se puede utilizar la forma alternativa de flock, flock <fd>, donde <fd> es un descriptor de archivo. Si pones esto en un subnivel, y redirigir ese descriptor de archivo para su archivo de bloqueo, entonces acuden va a esperar hasta que pueda escribir en ese archivo (o error si no se puede abrir de inmediato y que ha pasado -n). A continuación, puede hacer todo en su subnivel, incluyendo probar el valor de retorno de secuencias de comandos se ejecuta:

(
  if flock -n 200
  then
    myscript.sh
    echo $?
  fi
) 200>lockfile

Otros consejos

#!/bin/bash

if ! pgrep myscript.sh; then
  flock -n lockfile myscript.sh
fi

Si he entendido bien, usted quiere asegurarse de que 'myscript.sh' no se está ejecutando antes de cron intenta ejecutar el comando de nuevo. Suponiendo que es correcto, comprobamos para ver si pgrep no logró encontrar myscript.sh en la lista de procesos y si es así corremos el comando rebaño de nuevo.

Tal vez algo como esto podría funcionar para usted.

#!/bin/bash
RETVAL=0
lockfailed()
{
        echo "cannot flock"
        exit 1
}
(
        flock -w 2 42 || lockfailed
        false
        RETVAL=$?
        echo "original retval $RETVAL"
        exit $RETVAL
) 42>|/tmp/flocker
RETVAL=$?
echo "returned $RETVAL"
exit $RETVAL
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top