![Wie kann ich die Ausführung einer geplanten Aufgabe verhindern, wenn dieselbe Aufgabe bereits ausgeführt wird?](https://rvso.com/image/488047/Wie%20kann%20ich%20die%20Ausf%C3%BChrung%20einer%20geplanten%20Aufgabe%20verhindern%2C%20wenn%20dieselbe%20Aufgabe%20bereits%20ausgef%C3%BChrt%20wird%3F.png)
Ich habe ein PHP-Skript geschrieben, um zu prüfen, ob sich in einem Ordner neue Dateien befinden, und diese, falls vorhanden, auf einen Server hochzuladen. Diese Dateien können ziemlich groß sein. Ich möchte dieses Skript häufig ausführen – sagen wir alle 5 Minuten – als geplante Aufgabe, damit die Dateien so schnell wie möglich auf den Server verschoben werden. Wenn das Skript jedoch bereits versucht, eine Datei hochzuladen, möchte ich es nicht erneut ausführen, 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, wenn es nicht bereits ausgeführt wird?
Antwort1
Vorausgesetzt, Sie stellen die Aufgabe im XP-System „Geplante Aufgaben“ nur auf „Wiederholen“ ein, ist von Ihrer Seite keine weitere Aktion erforderlich. Geplante Aufgaben „wiederholen“ eine Aufgabe nicht, wenn sie bereits ausgeführt wird.
Wenn Sie diese Vorgabe überschreiben möchten, können Sie das Kontrollkästchen „Wenn die Aufgabe noch ausgeführt wird, jetzt beenden“ aktivieren. Dadurch beendet der Aufgabenplaner die letzte Instanz, bevor eine neue gestartet wird (obwohl es sich anhört, als ob Sie das wahrscheinlich nicht möchten).
Antwort2
Ich habe dies so gemacht, dass ich die Aufgabe aus einer Batchdatei ausführe, die einmal täglich kurz nach Mitternacht startet und bis zur nächsten Mitternacht läuft. Der Vorteil dabei ist, dass Sie, da es sich um ein einzelnes Skript handelt, keine zweite Instanz ausführen können. Ein Nachteil könnte sein, dass Sie genau vorhersagen können, wie oft das Skript ausgeführt wird, da es nach jedem Durchlauf eine festgelegte Zeit warten würde. Falls es Sie interessiert, sieht mein Skript folgendermaßen 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
Antwort3
Im Windows-Taskplaner gibt es ein Kontrollkästchen (oder Optionen), was zu tun ist, wenn der Task bereits ausgeführt wird, wenn er erneut gestartet wird. Sie können festlegen, dass er nicht gestartet wird oder parallel ausgeführt wird
Antwort4
Normalerweise wird beim Starten der Aufgabe geprüft, ob ein globales Ding vorhanden ist (häufig eine bestimmte leere Datei). Wenn es vorhanden ist, wird die Aufgabe bereits ausgeführt. Wenn nicht, legen Sie das globale Ding fest, erledigen Sie Ihre Arbeit und heben Sie das globale Ding auf, wenn die Aufgabe abgeschlossen ist.
Dies führt zu Problemen, wenn die Aufgabe fehlschlägt, ohne dass das globale Ding deaktiviert wird. Möglicherweise möchten Sie es immer in der Startroutine des Computers 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 beendet ist.