Wie kann ich verhindern, dass eine geplante Aufgabe ausgeführt wird, wenn dieselbe Aufgabe bereits ausgeführt wird?

11

Ich habe ein PHP-Skript geschrieben, um zu überprüfen, ob sich neue Dateien in einem Ordner befinden, und um sie auf einen Server hochzuladen, falls neue Dateien vorhanden sind. Diese Dateien können sehr groß sein. Ich möchte dieses Skript häufig - beispielsweise alle 5 Minuten - als geplante Aufgabe ausführen, damit die Dateien so schnell wie möglich auf den Server verschoben werden. Sobald das Skript jedoch bereits versucht, eine Datei hochzuladen, möchte ich nicht, dass sie erneut ausgeführt wird, da ich befürchte, dass die zweite Instanz die Datei überschreibt, die bereits auf den Server hochgeladen wird.

Wie kann ich das Skript als geplante Aufgabe ausführen, es sei denn, das Skript wird bereits ausgeführt?

Oren Hizkiya
quelle

Antworten:

21

Angenommen, Sie setzen die Aufgabe im XP-System "Geplante Aufgaben" nur auf "Wiederholen", sind keine weiteren Maßnahmen von Ihrer Seite erforderlich. Geplante Aufgaben "wiederholen" eine Aufgabe nicht, wenn sie bereits ausgeführt wird.

Wenn Sie diese Standardeinstellung überschreiben möchten, können Sie das Kontrollkästchen "Wenn die Aufgabe noch ausgeführt wird, stoppen Sie sie zu diesem Zeitpunkt" aktivieren, damit der Aufgabenplaner die letzte Instanz beendet, bevor eine neue gestartet wird (obwohl es sich so anhört, als würden Sie wahrscheinlich nicht will das nicht).

Evan Anderson
quelle
2

So habe ich die Aufgabe aus einer Batch-Datei ausgeführt, die einmal täglich kurz nach Mitternacht startet und bis zur nächsten Mitternacht ausgeführt wird. Dies hat den Vorteil, dass keine zweite Instanz ausgeführt werden kann, da es sich um ein einzelnes Skript handelt. Ich nehme an, ein Nachteil könnte sein, dass Sie genau vorhersagen können, wie oft das Skript ausgeführt wird, da es nach jedem Ausführen eine festgelegte Zeit warten würde. Wenn Sie interessiert sind, sieht mein Skript wie folgt aus:

rem *** Get the day number. When the day number changes that signals
rem *** the script to exit.

for /f "tokens=1" %%i in ('date /t') do set THEDATE=%%i
set THEDAY=%THEDATE:~0,2%

rem *** Open the log file

echo Starting Whatever >%LOGFILE%
date /t >>%LOGFILE%
echo . >>%LOGFILE%

rem *** Start the monitoring loop

:start

rem *** Run your script

rem Run the script here

rem *** Pause for 300 seconds

sleep 300

rem *** Check the day number. If it is still the same loop back to the
rem *** start of the monitoring loop.

for /f "tokens=1" %%i in ('date /t') do set THEDATE=%%i
if %THEDATE:~0,2% == %THEDAY% goto start

JR

John Rennie
quelle
1

Im Windows-Taskplaner gibt es ein Kontrollkästchen (oder Optionen), was zu tun ist, wenn die Aufgabe bereits ausgeführt wird, wenn die Aufgabe erneut gestartet wird. Sie können festlegen, dass es nicht parallel gestartet oder ausgeführt wird

Kevin Kuphal
quelle
1
Wo ist diese Einstellung im XP-Taskplaner? Ich finde keine Möglichkeit, den XP-Scheduler dazu zu bringen, dieselbe Aufgabe mehrmals parallel auszuführen.
Evan Anderson
Vista. Ich bemerkte das Windows-XP-Tag, nachdem ich meine Antwort eingegeben hatte.
Kevin Kuphal
0

Die übliche Methode besteht darin, beim Start der Aufgabe auf ein globales Ding (häufig eine bestimmte leere Datei) zu testen. Wenn vorhanden, wird die Aufgabe bereits ausgeführt. Wenn nicht, setzen Sie das globale Ding, erledigen Sie Ihre Aufgaben und deaktivieren Sie das globale Ding, wenn die Aufgabe erledigt ist.

Dies hat Probleme, wenn die Aufgabe fehlschlägt, ohne das globale Ding zu deaktivieren. Möglicherweise möchten Sie es immer in der Computer-Startroutine deaktivieren, da die Aufgabe nach einem Neustart nicht ausgeführt werden kann. Besser ist es, ein globales Ding zu finden, das automatisch verschwindet, wenn die Aufgabe endet.


quelle