web-dev-qa-db-fra.com

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

J'ai écrit un script PHP pour vérifier s'il existe des nouveaux fichiers dans un dossier et, si des nouveaux fichiers existent, téléchargez-les sur un serveur. Ces fichiers peuvent être assez importants. Je souhaite 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. Toutefois, une fois que le script tente déjà de télécharger un fichier, je ne veux pas qu'il soit exécuté à nouveau, car je crains que la seconde instance écrase le fichier déjà téléchargé sur le serveur.

Comment puis-je exécuter le script comme une tâche planifiée à moins que le script fonctionne déjà?

11
Oren Hizkiya

En supposant que vous définissez simplement la tâche de "répéter" dans le système XP "Tâches planifiées", aucune action supplémentaire de votre pièce n'est nécessaire. Les tâches planifiées ne "répètent" pas une tâche si C'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 à l'heure actuelle" pour que le planificateur de tâche tue la dernière instance avant de commencer une nouvelle (bien que cela ressemble à ce que vous sonnez probablement pas 't veux ça).

21
Evan Anderson

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 de temps après minuit et se déroule jusqu'au prochain minuit. L'avantage de ceci est que parce que c'est un script unique, vous ne pouvez pas obtenir une seconde instance en cours d'exécution. Je suppose qu'un inconvénient peut être que vous pouvez prédire exactement la fréquence à laquelle le script fonctionne parce qu'il attendrait une heure fixe après chaque course. Quoi qu'il en soit, si vous êtes intéressé mon script ressemble à:

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

2
John Rennie

Dans le planificateur de tâches Windows, il existe une case à cocher (ou OPTIONS) pour quoi faire si la tâche est déjà en cours d'exécution lorsque la tâche recommence. Vous pouvez le définir de ne pas démarrer ou courir en parallèle

1
Kevin Kuphal

La voie habituelle est de tester une chose mondiale (souvent un fichier vide spécifique) lorsque la tâche commence. S'il existe, la tâche est déjà en cours d'exécution. Sinon, définissez le truc global, faites vos affaires, déséquitant la chose mondiale lorsque la tâche est terminée.

Cela pose des problèmes si la tâche échoue sans désétablir la chose mondiale. Vous voudrez peut-être toujours le désierrer dans la routine de démarrage de l'ordinateur car la tâche ne peut pas fonctionner si vous avez redémarré. Mieux vaut trouver une chose globale qui s'en va automatiquement lorsque la tâche se termine.

0
D-Coder