
Ich versuche, zwei Skripte zu schreiben. Aber ich stoße auf Probleme, wenn ich versuche, zu verhindern, dass eines von beiden zweimal hintereinander ausgeführt wird. Ich habe beispielsweise Skript1 und Skript2. Ich möchte Skript1 genau dann ausführen können, wenn Skript2 seit dem letzten Ausführen von Skript1 ausgeführt wurde. Irgendwelche Ideen?
Antwort1
Überprüfen Sie in Skript A, ob eine bestimmte Datei vorhanden ist. Wenn nicht, berühren Sie eine Datei im Verzeichnis /tmp (z. B.: touch /tmp/script.lock
) und führen Sie den Code aus. Überprüfen Sie dann in Skript B, ob die Datei vorhanden ist. Wenn die Datei vorhanden ist, führen Sie den Hauptteil des Skripts aus und löschen Sie die Datei anschließend.
Skript A:
if [ ! -f /tmp/script.lock ]
then
echo hello
touch /tmp/script.lock
fi
Skript B:
if [ -f /tmp/script.lock ]
then
echo hello
rm /tmp/script.lock
fi
Antwort2
Lassen Sie jedes Skript eine bestimmte Datei überprüfen (z. B. /var/tmp/script1-2
).
Wenn die Prüfdatei nicht existiert, schreiben Sie den Namen des anderen Skripts so früh wie möglich in die Datei, um zu verhindern, dass es ausgeführt wird, während dieses Skript ausgeführt wird.
Wenn es existiert und seinen eigenen Namen enthält, beenden Sie es. Andernfalls führen Sie es normal aus.
Unmittelbar vor dem Beenden sollte jedes Skript seinen eigenen Namen in die Datei schreiben.
CHECKFILE="/var/tmp/script1-2"
MYNAME='script1'
OTHERNAME='script2'
[ ! -s "$CHECKFILE" ] && echo "$OTHERNAME" > "$CHECKFILE"
[ -s "$CHECKFILE" ] && grep -qwF "$MYNAME" && exit 1
# rest of script here
.
.
echo "$MYNAME" > "$CHECKFILE"
Die grep
Optionen sind:
-q
für Ruhe, keine Ausgabe erzeugen-w
nur für die Übereinstimmung mit ganzen Wörtern-F
zum Abgleichen fester Zeichenfolgen, nicht regulärer Ausdrücke.
Hinweis: Wenn beide Skripte gleichzeitig ausgeführt werdengenauzur gleichen Zeit und $CHECKFILE existiert noch nicht, dann werden beide ausgeführt. Welches davon zuletzt fertig wird (mehr Zeit zum Ausführen benötigt), wird am Ende mit seinem Namen in $CHECKFILE geschrieben. Um dies zu verhindern, führen Sie es aus, echo script2 > /var/tmp/script1-2
bevor Sie eines von beiden ausführen.
Antwort3
Eine Möglichkeit wäre, den Befehl „date“ in Skript 1 auszuführen und die Ausgabe in eine Datei umzuleiten, beispielsweise „file.txt“. Anschließend kann Skript 2 diese „file.txt“ lesen und einen „Datumsvergleich“ zwischen diesem Datum und dem Datum durchführen, an dem Skript 2 ausgeführt wurde. „Datumsvergleiche“ sollten relativ einfach durchzuführen sein – im Internet gibt es (glaube ich) jede Menge Beispiele. Stoff zum Nachdenken.
Eine weitere Option (abhängig von Ihren Anforderungen) ist natürlich das Hinzufügen von „Cron“-Jobeinträgen.
Antwort4
Wenn Sie nur wissen möchten, ob Skript2 bereits ausgeführt wurde, gehen Sie wie folgt vor:
Führen Sie in Skript2 überall Folgendes aus:
touch .ran_already
.
Führen Sie nun in Skript1 Folgendes aus:
if [ -f .ran_already ] then Here comes what the script does.. rm -f .ran_already else echo "script2 didn't run yet!" fi
Das wird Ihnen gute Dienste leisten, auch wenn es schnell und schmutzig ist.