
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 procmail
Paket, 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
.