Tarefa Cron para cada minuto executando fora de ordem?

3

Estou configurando alguns scripts de shell para serem executados a cada cinco minutos e, em seguida, a cada minuto no sistema de nosso cliente, para pesquisar um log e extrair algumas informações de tempo para serem armazenadas e acessadas por outro aplicativo através de um arquivo externo. A implementação atual que temos em funcionamento funciona bem, pois grava uma única linha em dois arquivos separados. Estamos refinando o processo, então agora preciso escrever duas linhas em um arquivo a cada cinco minutos e quatro linhas em outro para cada minuto. No entanto, notei em testes que a cada poucos minutos as linhas parecem ser executadas fora de ordem.

Meus scripts estão incluídos abaixo:

 */5 * * * *     ~/myscript.pl ~/mylog | tail -3 | head -1 > ~/myreport1
 */5 * * * *     ~/myscript.pl ~/mylog | tail -2 | head -1 >> ~/myreport1

 * * * * *       ~/myscript.pl ~/mylog | tail -8 | head -1 > ~/myreport2
 * * * * *       ~/myscript.pl ~/mylog | tail -7 | head -1 >> ~/myreport2
 * * * * *       ~/myscript.pl ~/mylog | tail -3 | head -1 >> ~/myreport2
 * * * * *       ~/myscript.pl ~/mylog | tail -2 | head -1 >> ~/myreport2

Em alguns casos, parece que apenas algumas linhas são executadas corretamente, enquanto que em outras, apenas uma linha é gravada. Eu nem vejo o número total de linhas escritas no arquivo o tempo todo, caso contrário, eu apenas assumiria que os valores que eu estava puxando não estavam sendo coletados corretamente. Não tenho certeza de como julgar se todas as linhas do cron estão sendo executadas, e o que poderia estar causando a ocorrência delas fora de ordem ou de maneira alguma.

    
por Nick L. 19.06.2013 / 19:47

2 respostas

3

Não há garantia de que o cron executará tarefas na ordem em que aparecem no cronfile. Na verdade, pode muito bem executar duas tarefas simultaneamente. Portanto, definitivamente não é uma boa ideia que as tarefas dependam umas das outras. Por exemplo, no seu cronfile, uma tarefa cria um arquivo e outro (ou três) anexa a ele. Se o remetente começar primeiro, o criador excluirá efetivamente o trabalho do remetente.

Melhor seria criar um script de driver com as quatro execuções a cada minuto de myscript e outro com as duas execuções a cada cinco minutos. Em seguida, você pode cronografar os dois scripts de driver, resultando em apenas uma tarefa Cron para cada intervalo de tempo.

    
por 19.06.2013 / 19:54
2

No que diz respeito ao cron, você tem muitos comandos que são executados ao mesmo tempo. O Cron apenas cria alguns processos-filhos que são executados "em paralelo" - ou seja, eles são de alguma forma multi-tarefas / agendados, o que introduz corridas de dados para o seu caso de uso.

Para o seu problema, você realmente não precisa do cron. Um script de shell simples como este é suficiente:

#!/bin/sh
function f1() {
  ~/myscript.pl ~/mylog | tail -3 | head -1 > ~/myreport1
  ~/myscript.pl ~/mylog | tail -2 | head -1 >> ~/myreport1
}

function f2() {
 ~/myscript.pl ~/mylog | tail -8 | head -1 > ~/myreport2
 ~/myscript.pl ~/mylog | tail -7 | head -1 >> ~/myreport2
 ~/myscript.pl ~/mylog | tail -3 | head -1 >> ~/myreport2
 ~/myscript.pl ~/mylog | tail -2 | head -1 >> ~/myreport2
}

while true; do
  f1
  f2
  sleep 1
  f2
  sleep 1
  f2
  sleep 1
  f2
  sleep 1
  f2
  sleep 1
done

Agora tudo está bem definido, ou seja, a ordem de execução é garantida.

Você pode iniciá-lo (como um trabalho em segundo plano) por meio de at - ou ligar de uma sessão screen .

    
por 19.06.2013 / 20:00