pare o processamento paralelo para um processo acionado por cron

2

Eu configurei os jobs cron do webservers para acionar alguns scripts PHP, a cada 15min, mas às vezes o script leva mais de 15 min para concluir a execução, no momento em que outro processo do mesmo script é iniciado. que está criando problemas em nossa lógica. Eu quero apenas uma instância do mesmo processo em execução e, se estiver concluída, apenas permita que o outro processo seja executado (não queira colocar o processo em uma fila, apenas finalize nesse momento e execute no próximo intervalo).

Exemplo: Eu tenho três arquivos PHP que serão chamados pela tarefa cron webservers a cada 15 min. digamos a.php, b.php, c.php. o script pode levar mais de 15 minutos para concluir a execução. No final da execução, ele atualiza nosso banco de dados, portanto, não pode executar duas cópias do mesmo arquivo de script (isso quebrará nossa lógica). Por exemplo, a.php é acionado às 16h e às 16h15 novamente o cron acionará a.php. aqui eu quero verificar se a.php completou a execução, se não ignorar a chamada e acionar às 16:30, marcando o mesmo caso, mas b.php, c.php e a.php são executados em paralelo (mas as mesmas instâncias podem t).

    
por Harish Kurup 10.06.2011 / 12:38

2 respostas

4

A prática padrão é usar um arquivo pid. Toda vez que o script é executado, verifique se um arquivo está sendo executado em algum lugar. A ordem das operações é descrita abaixo.

  • leia o pid em /var/run/yourscriptname.pid
  • verifique se o pid está em execução, saia se for
  • pegue seu pid, escreva para /var/run/yourscriptname.pid
  • executar como normal
  • remover o arquivo pid

No seu caso, isso funcionará, mas há alguns casos em que um script pode ser chamado rápido o suficiente para que, no tempo entre a verificação do pid e a gravação do pidfile, outro processo seja iniciado e também não veja pidfile e continue sendo executado. Você pode apertar ainda mais as coisas usando o bloqueio consultivo. É uma facilidade que o sistema operacional fornece em praticamente todos os Unix.

Referências:

por 10.06.2011 / 14:18
0

É difícil dizer a partir de sua pergunta se você deseja começar com um novo trabalho toda vez ou apenas pular uma rotação se ainda estiver em execução.

Se você quiser começar de novo a cada vez, o truque mais simples é adicionar um killall your_command; your_command ao seu cron.

Caso contrário, tente pgrep you_command || your_command em sua linha cron para executar apenas se um atual não for encontrado em execução.

Você também pode ficar mais sofisticado e registrar os PIDs do seu trabalho em algum tipo de arquivo de execução e, em seguida, verificar esse arquivo de execução para trabalhos ativos antes de começar a trabalhar. Se você encontrar um, você pode sair e deixá-lo rodar ou matar o outro e marcar seu próprio PID como o atual.

    
por 10.06.2011 / 12:54