Come faccio a verificare il codice di uscita di un comando eseguito da gregge?
-
21-09-2019 - |
Domanda
Un saluto tutti. Sono la creazione di un job cron per eseguire uno script bash, e sono preoccupati che il prossimo può iniziare prima che il precedente finisce. Un po 'googling rivela che un modo popolare per affrontare questo è il comando flock
, utilizzato nel modo seguente:
flock -n lockfile myscript.sh
if [ $? -eq 1 ]; then
echo "Previous script is still running! Can't execute!"
fi
Questa grande opera. Tuttavia, che cosa devo fare se voglio controllare il codice di uscita di myscript.sh
? Qualunque sia il codice di uscita che restituisce verrà sovrascritto da flock
di, quindi non ho modo di sapere se è stato eseguito con successo o meno.
Soluzione
Sembra che è possibile utilizzare la forma alternativa di flock
, flock <fd>
, dove <fd>
è un descrittore di file. Se mettete questo in una subshell, e reindirizzare che descrittore di file al file di blocco, quindi flock attenderà fino a che non può scrivere quel file (o errore fuori se non è possibile aprire immediatamente e hai superato -n
). È quindi possibile fare tutto quanto in vostro subshell, tra cui testare il valore di ritorno di script si eseguono:
(
if flock -n 200
then
myscript.sh
echo $?
fi
) 200>lockfile
Altri suggerimenti
#!/bin/bash
if ! pgrep myscript.sh; then
flock -n lockfile myscript.sh
fi
Se ho capito bene, si vuole fare in modo 'myscript.sh' non è in esecuzione prima di cron tenta di eseguire di nuovo il comando. Partendo dal presupposto che è di destra, controlliamo per vedere se pgrep è riuscito a trovare myscript.sh nella lista dei processi e in tal caso si corre di nuovo il comando gregge.
Forse qualcosa di simile potrebbe funzionare per voi.
#!/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