
Ich muss ein Verzeichnis überwachen. Wenn es aktualisiert wird, führe ich einen Befehl über incron aus. Wenn mehrere Dateien in dieses Verzeichnis kopiert werden, führt incron mehrere Befehle gleichzeitig aus. Gibt es eine Möglichkeit, dass, wenn ein Job von incron ausgeführt wird, der zweite Job nicht ausgeführt wird? Ich habedieses Tutorialzur Führung.
Antwort1
Nein, incron verfügt nicht über eine integrierte Sperrfunktion. Wenn Sie verhindern möchten, dass mehrere Jobs gleichzeitig ausgeführt werden, tun Sie dies innerhalb des Jobs.
Wenn Sie einen Job verzögern möchten, bis die vorherigen abgeschlossen sind, lassen Sie sie sperren. Sie können dieflock
Befehl. Beispiele finden Sie auf der Manpage.
Wenn Sie einen Job überspringen möchten, da der vorherige noch nicht abgeschlossen ist, können Sie trotzdem verwenden flock
, allerdings mit einem Timeout von 0. Wenn Sie die Sperre nicht erhalten können, beenden Sie den Job. Beachten Sie, dass dies anfällig für einen Race Condition ist: Es könnte passieren, dass eine neue Datei kopiert wird, kurz nachdem Job Nr. 1 mit der Aufzählung der Dateien fertig war, aber bevor er Zeit hatte, die Sperre freizugeben, und Job Nr. 2 würde sehen, dass die Sperre noch besteht, und den Job beenden, ohne die Datei zu verarbeiten. Es gibt keine einfache Möglichkeit, diesen Race Condition zu lösen.
Antwort2
Ein einfachstes Lösungsbeispiel: Angenommen, 1 bedeutet, dass die Datei gesperrt ist (das vorherige Skript wird bereits ausgeführt) und 0 bedeutet, dass sie entsperrt ist (kein Prozess wird ausgeführt).
Hier ist der Code
state=`cat /tmp/my_lck`
if [ "$state" -eq 1 ];then
echo "Already executing!!!"
exit
else
#Lock the file
echo 1 > /tmp/nws_lck
#Put you code here
#Unlock
echo 0 > /tmp/nws_lck
fi