Как предотвратить запуск запланированной задачи, если такая же задача уже запущена?

Как предотвратить запуск запланированной задачи, если такая же задача уже запущена?

Я написал скрипт php для проверки наличия новых файлов в папке и, если таковые имеются, загрузки их на сервер. Эти файлы могут быть довольно большими. Я хочу запускать этот скрипт часто — скажем, каждые 5 минут — как запланированную задачу, чтобы файлы перемещались на сервер как можно скорее. Однако, как только скрипт уже пытается загрузить файл, я не хочу, чтобы он запускался снова, так как я боюсь, что второй экземпляр перезапишет файл, который уже загружается на сервер.

Как запустить скрипт как запланированную задачу, если скрипт еще не запущен?

решение1

Если вы просто устанавливаете задачу на «Повторить» в системе «Запланированные задачи» XP, то никаких дополнительных действий с вашей стороны не требуется. Запланированные задачи не будут «Повторять» задачу, если она уже запущена.

Если вы хотите переопределить это значение по умолчанию, вы можете установить флажок «Если задача все еще выполняется, остановить ее в это время», чтобы планировщик задач завершил последний экземпляр перед запуском нового (хотя, похоже, вы этого, вероятно, не хотите).

решение2

Я сделал это, запустив задачу из пакетного файла, который запускается один раз в день вскоре после полуночи и работает до следующей полуночи. Преимущество этого в том, что, поскольку это один скрипт, вы не можете запустить второй экземпляр. Полагаю, недостатком может быть то, что вы можете точно предсказать, как часто будет запускаться скрипт, поскольку он будет ждать установленное время после каждого запуска. В любом случае, если вам интересно, мой скрипт выглядит так:

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

Дж.Р.

решение3

В планировщике задач Windows есть флажок (или параметры) для того, что делать, если задача уже запущена, когда задача запускается снова. Вы можете настроить ее так, чтобы она не запускалась или работала параллельно

решение4

Обычный способ — проверить наличие какой-то глобальной штуки (часто конкретного пустого файла) при запуске задачи. Если она существует, задача уже выполняется. Если нет, установите глобальную штуку, сделайте свое дело, снимите глобальную штуку, когда задача будет выполнена.

Это создает проблемы, если задача не выполняется без сброса глобальной штуки. Вы можете всегда сбрасывать ее в процедуре запуска компьютера, поскольку задача не может быть запущена, если вы перезагрузили компьютер. Лучше найти глобальную штуку, которая автоматически отключается, когда задача завершается.

Связанный контент