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.

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top