Come posso impedire l'esecuzione di un'attività pianificata se la stessa attività è già in esecuzione?


11

Ho scritto uno script php per verificare se ci sono nuovi file in una cartella e, se esistono nuovi file, caricarli su un server. Questi file possono essere piuttosto grandi. Voglio eseguire questo script frequentemente, diciamo ogni 5 minuti, come un'attività pianificata in modo che i file vengano spostati sul server il più presto possibile. Tuttavia, una volta che lo script sta già tentando di caricare un file, non voglio che venga eseguito di nuovo, poiché temo che la seconda istanza sovrascriverà il file che è già stato caricato sul server.

Come posso eseguire lo script come attività pianificata a meno che lo script non sia già in esecuzione?

Risposte:


21

Supponendo che tu stia semplicemente impostando l'attività su "Ripeti" nel sistema "Operazioni pianificate" di XP, non sono necessarie ulteriori azioni da parte tua. Le attività pianificate non "ripetono" un'attività se è già in esecuzione.

Se si desidera sovrascrivere tale impostazione predefinita, è possibile selezionare la casella "Se l'attività è ancora in esecuzione, interromperla in questo momento" per fare in modo che l'utilità di pianificazione uccida l'ultima istanza prima di avviarne una nuova (anche se sembra che probabilmente non si non lo voglio).


2

Il modo in cui l'ho fatto è eseguire l'attività da un file batch che inizia una volta al giorno poco dopo la mezzanotte e viene eseguito fino alla mezzanotte successiva. Il vantaggio di questo è che, poiché si tratta di un singolo script, non è possibile eseguire una seconda istanza. Suppongo che uno svantaggio sia che puoi prevedere con esattezza la frequenza con cui lo script viene eseguito perché attenderebbe un tempo prestabilito dopo ogni esecuzione. Ad ogni modo, se sei interessato, la mia sceneggiatura è simile a:

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


1

Nell'utilità di pianificazione di Windows è presente una casella di controllo (o opzioni) per cosa fare se l'attività è già in esecuzione al riavvio dell'attività. È possibile impostare per non avviare o eseguire in parallelo


1
Dov'è quell'impostazione nell'utilità di pianificazione XP? Non trovo alcun modo per convincere lo scheduler XP a eseguire la stessa attività più volte in parallelo.
Evan Anderson,

Vista. Ho notato il tag windows-xp dopo aver inserito la mia risposta.
Kevin Kuphal,

0

Il solito modo è testare qualcosa globale (spesso un file vuoto specifico) all'avvio dell'attività. Se esiste, l'attività è già in esecuzione. In caso contrario, imposta le cose globali, fai le tue cose, disattiva le cose globali al termine dell'attività.

Ciò ha problemi se l'attività fallisce senza sconvolgere la cosa globale. Potresti volerlo sempre disinserire nella routine di avvio del computer poiché l'attività non può essere eseguita se hai riavviato. È meglio trovare un oggetto globale che scompaia automaticamente al termine dell'attività.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.