Я написал php-скрипт, чтобы проверить, есть ли новые файлы в папке, и, если есть новые файлы, загрузить их на сервер. Эти файлы могут быть довольно большими. Я хочу запускать этот сценарий часто - скажем, каждые 5 минут - как запланированную задачу, чтобы файлы были перемещены на сервер как можно скорее. Однако, как только сценарий уже пытается загрузить файл, я не хочу, чтобы он запускался снова, так как я боюсь, что второй экземпляр перезапишет файл, который уже загружается на сервер.
Как я могу запустить сценарий как запланированную задачу, если он еще не запущен?
Предполагая, что вы просто устанавливаете задачу «Повторить» в системе «Запланированные задачи XP», никаких дальнейших действий с вашей стороны не требуется. Запланированные задачи не будут «повторять» задачу, если она уже выполняется.
Если вы хотите переопределить это значение по умолчанию, вы можете установить флажок «Если задача все еще выполняется, остановить ее сейчас», чтобы планировщик задач убил последний экземпляр перед запуском нового (хотя это звучит так, как будто вы, вероятно, не не хочу этого).
Я сделал это так, чтобы запустить задачу из командного файла, который запускается один раз в день вскоре после полуночи и выполняется до следующей полуночи. Преимущество этого в том, что поскольку это один сценарий, вы не можете запустить второй экземпляр. Я полагаю, что недостатком может быть то, что вы можете точно предсказать, как часто будет запускаться скрипт, потому что он будет ждать установленное время после каждого запуска. В любом случае, если вам интересно, мой сценарий выглядит так:
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
В планировщике задач Windows есть флажок (или параметры), указывающий, что делать, если задача уже выполняется, когда задача запускается снова. Вы можете настроить его не запускать или запускать параллельно
Обычно при запуске задачи проверяется наличие какой-то глобальной штуки (часто конкретного пустого файла). Если он существует, задача уже выполняется. Если нет, установите глобальный элемент, делайте свое дело, отключите глобальный элемент, когда задача будет выполнена.
У этого есть проблемы, если задача не удалась, не отключив глобальную вещь. Вы можете всегда отключать его в процедуре запуска компьютера, поскольку задача не может быть запущена после перезапуска. Лучше найти глобальную штуку, которая уходит автоматически, когда задача заканчивается.