Wie überprüfe ich, ob ein Skript ausgeführt wird, und pausiere es, bis die Instanz abgeschlossen ist, um es erneut ausführen zu können?

Wie überprüfe ich, ob ein Skript ausgeführt wird, und pausiere es, bis die Instanz abgeschlossen ist, um es erneut ausführen zu können?

Wir führen also dieses Skript aus, das Daten zu einer Datei hinzufügt, und ich versuche, etwas hinzuzufügen, um zu prüfen, ob das Skript bereits ausgeführt wird. Wenn ja, dann möchte ich, dass es anhält und in 20 Sekunden erneut prüft und das wiederholt, bis es feststellt, dass es nicht ausgeführt wird. An diesem Punkt möchte ich, dass es mit dem Rest des Skripts fortfährt. Ich muss also wissen, wie ich es dazu bringe, weiter zu prüfen, bis es in Ordnung ist, fortzufahren. Hat jemand eine Idee?

    if [ `ps -ef| grep $script_name_with_arguments | wc -l ` -gt 1 ]
    then
      echo "already running"
      sleep 20s
    else
      echo "ok"
    fi
}```

Antwort1

Sie verwenden eine Art Verriegelung.

Der einfachste Weg ist eine Sperrdatei. Es gibt einige Pakete, die diese für Sie verwalten. Sie haben nicht gesagt, welche Plattform oder Distribution Sie verwenden, daher kann ich dazu nicht sehr genau sein, aber eines davon ist das procmailPaket, das mit dem Programm geliefert wird lockfile.

Sie würden es in Ihrem Skript folgendermaßen verwenden:

LOCK=/run/npaulsen/mylockfile.lock
lockfile -20 $LOCK
run_the_fscking_rest_of_my_script
rm -f $LOCK

Es gibt Verbesserungen, die Sie vornehmen können, um zu verhindern, dass es auf unbestimmte Zeit hängen bleibt, wenn eine Instanz abstürzt. Sie können die Manpage dazu lesen: man 1 lockfile. Oder Sie können Ihre eigene implementieren – das ist trivial, aber Sie benötigen eine echte Programmiersprache (kein Shell-Skript).

Eine andere, ausgefeiltere (aber auch komplexere) Idee wäre die Verwendung von POSIX-Semaphoren; versuchen Sie es man 7 sem_overview.

verwandte Informationen