Cron jobs acessando o mesmo arquivo estático

1

Estou tentando configurar duas tarefas cron separadas que acessam o mesmo arquivo estático. Um dos trabalhos é executado a cada minuto, agregando novos dados que chegaram ao arquivo. O segundo trabalho é executado a cada 30 minutos, analisando os dados agregados e truncando o arquivo para redefini-lo pelos próximos 30 minutos.

Obviamente, existe um potencial aqui para impasse a cada 30 minutos. Existe alguma maneira de escrever a tarefa cron para a primeira tarefa, de modo que ela só seja executada a cada minuto por 29 minutos (abreviação de listagem a cada minuto 1-60, excluindo 30 e 60) e, em seguida, recomeça no minuto 31? Obrigado!

Editar

Por solicitação, estou usando o PHP para realizar essas operações (já que há algum uso significativo de estruturas de dados envolvidas). Eu implementei o uso da função flock do PHP, e enquanto a documentação da função especifica que a chamada bloqueia até 1) o bloqueio é obtido, ou 2) a opção LOCK_NB é especificada, fiquei confuso com o fato de que o exemplo a seguir parece implicar que é possível não obter o bloqueio, mesmo com uma chamada de bloqueio.

A menos que isso se deva a algum outro problema (permissões, interrupções do sistema operacional, etc)? Esta questão de bloquear até obter um bloqueio foi realmente a motivação para a minha pergunta, para ver se havia outra maneira de evitar o bloqueio total dos arquivos, mitigando assim o risco de uma tentativa de bloqueio sem bloqueio falhar e a interrupção do script.

    
por Magsol 05.11.2009 / 20:53

2 respostas

2

Você não quer fazer isso; a única vez que seu trabalho leva mais de um minuto, você vai ser lavado. Condições de corrida como essa criam problemas feios: intermitentes, imprevisíveis e difíceis de diagnosticar.

O Pboin está exatamente correto: você precisa explorar o uso do semáforo em seu código e, em seguida, o problema desaparece e você não precisa se preocupar com conflitos de horários.

Qual idioma você está usando?

Editar (desculpas pelo php, não usei há algum tempo, e estou um pouco bêbado, então talvez não compile):

A tática "usual" com bloqueio é verificar um bloqueio (que neste caso eu faço tentando obter um), e se houver um, para implementar uma pequena espera e tente novamente. Você pode tentar usar a função sleep () do php dentro de um loop while, por exemplo:

while($x){
    if(flock($file_handle, LOCK_EX)){
        $x = false;
    }else{
        sleep(5);
        $x = true;
    }
}

Eu uso algo semelhante a isso para toneladas de trabalhos de gravação baseados em cron. Funciona como um encanto. Na verdade, é um método semelhante ao protocolo de comunicações ALOHA, que é muito semelhante a um protocolo de rede posterior chamado "TCP / IP". Tente, tente e tente novamente.

    
por 05.11.2009 / 21:19
1

Bem, você poderia listar seus minutos no cron como sugeriu, mas isso não está realmente resolvendo o problema. (Por um lado, o cron não garante a execução dentro de um determinado minuto.)

Provavelmente, seria melhor implementar algumas funcionalidades de bloqueio no seu script - é muito menos invasivo. O Guia de Scripts Avançados do Bash , um recurso excelente e gratuito sugere o comando lockfile , que irá ajudá-lo faça isso.

Você terá muito menos com o que se preocupar ao fazer isso corretamente.

    
por 05.11.2009 / 21:03

Tags