Como posso evitar que uma tarefa agendada seja executada se a mesma tarefa já estiver sendo executada?

9

Eu escrevi um script php para verificar se há novos arquivos em uma pasta e, se houver novos arquivos, faça o upload deles para um servidor. Esses arquivos podem ser muito grandes. Eu quero executar este script com freqüência - digamos a cada 5 min - como uma tarefa agendada para que os arquivos sejam movidos para o servidor o mais rápido possível. No entanto, quando o script já estiver tentando carregar um arquivo, não quero que ele seja executado novamente, pois temo que a segunda instância sobrescreva o arquivo que já está sendo enviado para o servidor.

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

    
por Oren Hizkiya 14.07.2009 / 17:08

4 respostas

19

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

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

    
por 14.07.2009 / 17:15
2

A maneira como fiz isso é executar a tarefa a partir de um arquivo em lotes que é iniciado uma vez por dia logo após a meia-noite e é executado até a meia-noite seguinte. A vantagem disso é que, como é um script único, você não consegue executar uma segunda instância. Eu suponho que uma desvantagem pode ser que você pode prever exatamente com que frequência o script é executado porque ele esperaria um tempo definido após cada execução. De qualquer forma, se você está interessado meu script parece:

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

    
por 14.07.2009 / 17:41
1

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

    
por 14.07.2009 / 17:14
0

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. Se não, defina a coisa global, faça suas coisas, desanime a coisa global quando a tarefa estiver concluída.

Isso tem problemas se a tarefa falhar sem desfazer a coisa global. Você pode querer sempre desabilitá-lo na rotina de inicialização do computador, pois a tarefa não pode ser executada se você tiver reiniciado. Melhor é encontrar uma coisa global que desaparece automaticamente quando a tarefa termina.

    
por 14.07.2009 / 17:40