Como impedir que uma tarefa agendada seja executada se a mesma tarefa já estiver em execução?

11

Eu escrevi um script php para verificar se há novos arquivos em uma pasta e, se existirem novos arquivos, carregue-os 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, quando 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?

Oren Hizkiya
fonte

Respostas:

21

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

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

Evan Anderson
fonte
2

A maneira como eu fiz isso é executar a tarefa a partir de um arquivo em lotes que inicia uma vez por dia logo após a meia-noite e é executado até a próxima meia-noite. A vantagem disso é que, por ser um script único, não é possível obter uma segunda instância em execução. Suponho que uma desvantagem seja que você pode prever exatamente com que frequência o script é executado, porque ele aguardaria 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

John Rennie
fonte
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 reiniciada. Você pode configurá-lo para não iniciar ou executar em paralelo

Kevin Kuphal
fonte
1
Onde está essa configuração no agendador de tarefas do XP? Não estou encontrando nenhuma maneira de fazer com que o agendador do XP execute a mesma tarefa várias vezes em paralelo.
Evan Anderson
Vista. Percebi a tag windows-xp depois de inserir minha resposta.
21411 Kevin Kuphal
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. Caso contrário, defina o item global, faça suas coisas, desmarque o item global quando a tarefa estiver concluída.

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


fonte