Como posso impedir a execução de uma tarefa agendada se a mesma tarefa já estiver em execução?

Como posso impedir a execução de uma tarefa agendada se a mesma tarefa já estiver em execução?

Eu escrevi um script php para verificar se há algum arquivo novo em uma pasta e, se existir algum arquivo novo, carregue-o em um servidor. Esses arquivos podem ser bem grandes. Quero executar esse script com frequência, digamos a cada 5 minutos, como uma tarefa agendada para que os arquivos sejam movidos para o servidor o mais rápido possível. No entanto, uma vez que o script já está tentando fazer upload de um arquivo, não quero que ele seja executado novamente, pois temo que a segunda instância substitua o arquivo que já está sendo carregado no servidor.

Como posso executar o script como uma tarefa agendada, a menos que o script já esteja em execução?

Responder1

Supondo que você esteja apenas configurando a tarefa para "Repetir" no sistema XP "Tarefas agendadas", nenhuma ação adicional de sua parte será necessária. As tarefas agendadas não "repetirão" uma tarefa se ela já estiver em execução.

Se quiser substituir esse padrão, você pode marcar a caixa "Se a tarefa ainda estiver em execução, pare-a neste momento" para fazer com que o agendador de tarefas elimine a última instância antes de iniciar uma nova (embora pareça que você provavelmente não não quero isso).

Responder2

A maneira como fiz isso foi executar a tarefa a partir de um arquivo em lote que começa uma vez por dia, logo depois da meia-noite, e vai até a próxima meia-noite. A vantagem disso é que, por ser um script único, você não pode executar uma segunda instância. Suponho que uma desvantagem seja que você pode prever exatamente com que frequência o script é executado, pois ele esperaria um tempo definido após cada execução. De qualquer forma, se você estiver interessado, meu script se parece com:

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.

Responder3

No agendador de tarefas do Windows, há uma caixa de seleção (ou opções) para saber o que fazer se a tarefa já estiver em execução quando for iniciada novamente. Você pode configurá-lo para não iniciar ou executar em paralelo

Responder4

A maneira usual é testar alguma coisa global (geralmente um arquivo vazio específico) quando a tarefa é iniciada. Se existir, a tarefa já está em execução. Caso contrário, defina a coisa global, faça o que quiser, desmarque a coisa global quando a tarefa estiver concluída.

Isso terá problemas se a tarefa falhar sem perturbar a coisa global. Você pode querer sempre desmarcá-lo na rotina de inicialização do computador, pois a tarefa não poderá ser executada se você tiver reiniciado. Melhor é encontrar algo global que desapareça automaticamente quando a tarefa termina.

informação relacionada