¿Cómo puedo comprobar el código de salida de un comando ejecutado por el rebaño?
-
21-09-2019 - |
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.
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