Comment empêcher l'exécution d'une tâche planifiée si la même tâche est déjà en cours d'exécution?

11

J'ai écrit un script php pour vérifier s'il y a de nouveaux fichiers dans un dossier et, si de nouveaux fichiers existent, les télécharger sur un serveur. Ces fichiers peuvent être assez volumineux. Je veux exécuter ce script fréquemment - disons toutes les 5 min - comme une tâche planifiée afin que les fichiers soient déplacés vers le serveur dès que possible. Cependant, une fois que le script tente déjà de télécharger un fichier, je ne souhaite pas qu'il soit exécuté à nouveau, car je crains que la deuxième instance n'écrase le fichier qui est déjà en cours de téléchargement sur le serveur.

Comment puis-je exécuter le script en tant que tâche planifiée à moins que le script ne soit déjà en cours d'exécution?

Oren Hizkiya
la source

Réponses:

21

En supposant que vous définissez simplement la tâche sur "Répéter" dans le système XP "Tâches planifiées", aucune autre action de votre part n'est nécessaire. Les tâches planifiées ne "répéteront" pas une tâche si elle est déjà en cours d'exécution.

Si vous souhaitez remplacer cette valeur par défaut, vous pouvez cocher la case «Si la tâche est toujours en cours d'exécution, arrêtez-la à ce moment» pour que le planificateur de tâches tue la dernière instance avant d'en démarrer une nouvelle (bien qu'il semble que vous ne l'ayez probablement pas veux pas ça).

Evan Anderson
la source
2

La façon dont je l'ai fait consiste à exécuter la tâche à partir d'un fichier de commandes qui commence une fois par jour peu après minuit et se poursuit jusqu'à minuit suivant. L'avantage de ceci est que parce qu'il s'agit d'un seul script, vous ne pouvez pas exécuter une deuxième instance. Je suppose qu'un inconvénient pourrait être que vous pouvez prédire exactement à quelle fréquence le script s'exécute, car il attendrait un certain temps après chaque exécution. Quoi qu'il en soit, si vous êtes intéressé, mon script ressemble à ceci:

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
la source
1

Dans le planificateur de tâches Windows, il y a une case à cocher (ou des options) pour savoir quoi faire si la tâche est déjà en cours d'exécution lorsque la tâche redémarre. Vous pouvez le configurer pour ne pas démarrer ou fonctionner en parallèle

Kevin Kuphal
la source
1
Où est ce paramètre dans le planificateur de tâches XP? Je ne trouve aucun moyen d'obtenir que le planificateur XP exécute la même tâche plusieurs fois en parallèle.
Evan Anderson
Vue. J'ai remarqué la balise windows-xp après avoir entré ma réponse.
Kevin Kuphal
0

La manière habituelle est de tester une chose globale (souvent un fichier vide spécifique) lorsque la tâche démarre. S'il existe, la tâche est déjà en cours d'exécution. Si ce n'est pas le cas, définissez le truc global, faites votre travail, désactivez le truc global lorsque la tâche est terminée.

Cela a des problèmes si la tâche échoue sans perturber le truc global. Vous souhaiterez peut-être toujours le désactiver dans la routine de démarrage de l'ordinateur car la tâche ne peut pas être exécutée si vous avez redémarré. Mieux vaut trouver un truc global qui disparaît automatiquement à la fin de la tâche.


la source