Jak mogę zapobiec uruchomieniu zaplanowanego zadania, jeśli to samo zadanie jest już uruchomione?

11

Napisałem skrypt php, aby sprawdzić, czy w folderze są jakieś nowe pliki, a jeśli jakieś istnieją, prześlij je na serwer. Te pliki mogą być dość duże. Chcę często uruchamiać ten skrypt - powiedzmy co 5 minut - jako zaplanowane zadanie, aby pliki zostały jak najszybciej przeniesione na serwer. Jednak gdy skrypt próbuje już przesłać plik, nie chcę, aby został ponownie uruchomiony, ponieważ obawiam się, że druga instancja nadpisze plik, który jest już przesyłany na serwer.

Jak mogę uruchomić skrypt jako zaplanowane zadanie, chyba że skrypt jest już uruchomiony?

Oren Hizkiya
źródło

Odpowiedzi:

21

Zakładając, że ustawiasz zadanie na „Powtórz” w systemie XP „Zaplanowane zadania”, nie musisz podejmować żadnych dalszych działań z Twojej strony. Zaplanowane zadania nie będą „powtarzać” zadania, jeśli jest już uruchomione.

Jeśli chcesz zastąpić to ustawienie domyślne, możesz zaznaczyć pole „Jeśli zadanie nadal działa, zatrzymaj je w tym momencie”, aby program planujący zadania zabił ostatnią instancję przed uruchomieniem nowej (choć wygląda na to, że prawdopodobnie nie tego nie chcę).

Evan Anderson
źródło
2

Sposób, w jaki to zrobiłem, to uruchomienie zadania z pliku wsadowego, który rozpoczyna się raz dziennie krótko po północy i działa do następnej północy. Zaletą tego jest to, że ponieważ jest to pojedynczy skrypt, nie można uruchomić drugiej instancji. Przypuszczam, że wadą może być to, że możesz dokładnie przewidzieć, jak często skrypt jest uruchamiany, ponieważ po każdym uruchomieniu czekałby określony czas. W każdym razie, jeśli jesteś zainteresowany, mój skrypt wygląda następująco:

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
źródło
1

W harmonogramie zadań systemu Windows znajduje się pole wyboru (lub opcje) określające czynności, które należy wykonać, jeśli zadanie jest już uruchomione po ponownym uruchomieniu zadania. Możesz ustawić, aby nie uruchamiał się ani nie działał równolegle

Kevin Kuphal
źródło
1
Gdzie to ustawienie w harmonogramie zadań XP? Nie znajduję żadnego sposobu, aby program planujący XP wykonał to samo zadanie wiele razy równolegle.
Evan Anderson
Widok. Zauważyłem znacznik windows-xp po wpisaniu odpowiedzi.
Kevin Kuphal
0

Zwykle sposób polega na przetestowaniu globalnej rzeczy (często określonego pustego pliku) podczas uruchamiania zadania. Jeśli istnieje, zadanie jest już uruchomione. Jeśli nie, ustaw globalną rzecz, rób swoje rzeczy, rozłącz globalną rzecz po zakończeniu zadania.

Ma to problemy, jeśli zadanie nie powiedzie się bez rozbrojenia globalnej sprawy. Zawsze możesz chcieć go rozbroić w procedurze uruchamiania komputera, ponieważ zadanie nie może zostać uruchomione po ponownym uruchomieniu. Lepiej jest znaleźć globalną rzecz, która zniknie automatycznie po zakończeniu zadania.


źródło