Escrevendo um sistema de bloqueio

4

Eu tenho um cronjob para rsync que é executado a cada 2 minutos, mas às vezes leva mais de 2 minutos. Para isso eu escrevi um sistema de bloqueio simples que verifica, se o arquivo não encontrado escreve o arquivo de bloqueio, toma medidas e exclui esse arquivo de bloqueio.

Agora, se o script falhar ou for morto por algum motivo, o arquivo de bloqueio permanecerá e causará problemas.

Qual seria uma boa maneira de garantir que a tarefa Cron seja executada novamente em algum momento? Eu pensei em verificar a idade do arquivo de bloqueio e excluí-lo, se mais velho, em seguida, um determinado período, mas deveria haver melhores soluções mais elegantes para isso eu acho ..

editado:

Eu agora implementei o flock. Eu estava um pouco confuso sobre o motivo pelo qual o arquivo sempre parece existir, mas eu encontrei esta página que explica como funciona, armazenando o pid nas informações do arquivo:

link

    
por datadevil 16.08.2012 / 10:18

3 respostas

5

Armazene o PID do processo crítico como parte do bloqueio e, quando executar o script novamente, verifique se o processo ainda está ativo.

A melhor maneira é usar um diretório de bloqueio em vez de um arquivo de bloqueio, já que o mkdir é uma operação atômica. Você não tem que verificar se o bloqueio existe e, em seguida, criá-lo se não, o que deixa uma janela de oportunidade para outra coisa para obter o bloqueio. Coloque o PID do processo crítico no diretório de bloqueio como um arquivo, etc.

No Linux, você pode usar o utilitário flock que lida com tudo isso para você.

    
por 16.08.2012 / 10:25
2

Verifique se o processo e o arquivo de bloqueio existe. Se apenas um deles existir, algo está errado e deve ser tratado corretamente. Por exemplo. Se o arquivo de trava existir e o processo não estiver em execução, exclua o arquivo de trava e siga em frente.

    
por 16.08.2012 / 10:23
1

Eu sei que você tem seu próprio sistema de bloqueio, mas eu farei isso com fcron e exesev (false)

exesev
boolean(false)
Can a job be executed several times simultaneously ?
    
por 16.08.2012 / 10:46

Tags