Wie prüfe ich den Exit-Code eines durch Herde ausgeführten Befehl?
-
21-09-2019 - |
Frage
Grüße alle. Ich gründe einen cron-Job auf einen Bash-Skript auszuführen, und ich bin besorgt, dass die nächste vor den vorherigen Enden beginnen. Ein wenig googeln zeigt, dass ein beliebter Weg, dies ist der flock
Befehl, in der folgenden Weise verwendet Adresse:
flock -n lockfile myscript.sh
if [ $? -eq 1 ]; then
echo "Previous script is still running! Can't execute!"
fi
Dies funktioniert gut. Aber was mache ich, wenn ich den Exit-Code von myscript.sh
überprüfen möchten? Unabhängig von Exit-Code wird durch flock
des überschrieben zurück, so dass ich keine Möglichkeit zu wissen, wenn es erfolgreich oder nicht ausgeführt wird.
Lösung
Es sieht aus wie Sie die alternative Form von flock
verwenden können, flock <fd>
, wo <fd>
ein Dateideskriptor ist. Wenn Sie diese in eine Subshell setzen, und umleiten zu Ihrer Sperrdatei, die Dateideskriptor, dann warten strömen, bis sie in diese Datei schreiben (oder Fehler aus, wenn es nicht sofort öffnen kann und Sie haben -n
bestanden). Anschließend können Sie alles in Ihrem Subshell tun, einschließlich Prüfung des Rückgabewertes von Skripten Sie ausführen:
(
if flock -n 200
then
myscript.sh
echo $?
fi
) 200>lockfile
Andere Tipps
#!/bin/bash
if ! pgrep myscript.sh; then
flock -n lockfile myscript.sh
fi
Wenn ich Sie recht verstehe, wollen Sie sicher, dass ‚myscript.sh‘ machen, wird nicht ausgeführt, bevor cron Versuche zum Ausführen des Befehls wieder. das ist richtig Unter der Annahme, überprüfen wir, ob pgrep fehlgeschlagen myscript.sh in der Prozessliste zu finden, und wenn ja wir den Herd Befehl erneut aus.
Vielleicht so etwas wie dies würde für Sie arbeiten.
#!/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