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

11

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

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

Орен Хизкия
источник

Ответы:

21

Предполагая, что вы просто устанавливаете задачу «Повторить» в системе «Запланированные задачи» 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

JR

Джон Ренни
источник
1

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

Кевин Куфал
источник
1
Где этот параметр в планировщике задач XP? Я не нахожу способа заставить планировщик XP выполнять одну и ту же задачу несколько раз параллельно.
Эван Андерсон
Vista. Я заметил тег windows-xp после того, как ввел свой ответ.
Кевин Куфал
0

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

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


источник