Por que meu crontab não foi acionado?


29

Eu costumava crontab -eadicionar a seguinte linha ao meu crontab:

* * * * * echo hi >> /home/myusername/test

No entanto, não vejo que o arquivo de teste esteja gravado. Isso é um problema de permissão ou o crontab não está funcionando corretamente?

Vejo que o processo cron está em execução. Como posso depurar isso?

Editar - Ask Ubuntu tem uma boa pergunta sobre o crontab , infelizmente isso ainda não me ajuda.

Edit 2 - Hmm, parece que meu arquivo de teste tem 214 linhas, o que significa que nos últimos 214 minutos foi gravado a cada minuto. Não sei ao certo qual foi o problema, mas evidentemente se foi.

Respostas:


23

Existem implementações de cron(nem todas elas, e não me lembro qual delas de imediato, mas encontrei uma no Linux) que verificam arquivos crontab atualizados a cada minuto e não consideram novas entradas até o próximo minuto . Portanto, um crontab pode levar até dois minutos para disparar pela primeira vez. Isso pode ser o que você observou.


1
Eu acho que Solaris, ou talvez Solaris mais cedo. Eu tenho o hábito de fazer com que a entrada cron seja executada em 3-5 minutos no futuro, quando eu testo um script a partir de uma entrada crontab, porque eu costumava ser enganado por esse comportamento o tempo todo.
precisa

fcronfaz isso também.
phunehehe

E se a rotina de "verificação" custar mais do que alguns minutos? Haverá cronjobs que devem ser acionados durante essa longa "verificação" que não foram acionados.
ospider

@ospider A verificação leva apenas uma fração de segundo.
Gilles 'SO- stop be evil'

28

Você adicionou uma linha vazia após seu cronjob ?


Há uma linha vazia após o meu cronjob.
ripper234

4
Não é uma linha vazia, mas uma nova linha no final da última linha. Um arquivo de texto deve consistir em uma sequência de linhas, cada uma terminada por uma nova linha, para que qualquer arquivo de texto não vazio termine com um caractere de nova linha. Alguns utilitários não processam nada após a última nova linha em um arquivo.
Gilles 'SO- stop be evil'

1
Esta é uma questão de termos, "caractere de nova linha" significa "após esse caractere iniciar uma nova linha de texto". Então 0 bytes entre a última mudança de linha EOF e também pode ser considerado como uma linha em branco ( "linha que contém 0 caracteres")
gelraen

10

Eu tive o mesmo problema - um crontab em funcionamento parou subitamente depois de adicionar uma nova entrada no final. Acabei me esquecendo de colocar uma nova linha depois dessa última linha.

Eu descobri emitindo o comando

cat /var/log/syslog | grep crontab

e a saída mostrou o problema:

Jul  2 08:16:01 shiva cron[1254]: (*system*) RELOAD (/etc/crontab)
Jul  2 08:16:01 shiva cron[1254]: (*system*) ERROR (Missing newline before EOF, this crontab file will be ignored)

Adicionar a nova linha e salvar corrigiu o problema.


5

Parece que isso é fixo. Da próxima vez, tente registrar o STDERR também. O seguinte registrará apenas STDOUT, não STDERR:

* * * * * echo hi >> /home/myusername/test

Tente garantir que também haja uma cláusula explícita para STDERR. Caso contrário, o STDERR poderá ser enviado por email ao usuário (supondo que o email esteja funcionando) ou poderá não chegar a lugar algum, dependendo de como o Cron estiver configurado.

* * * * * echo hi >> /home/myusername/test 2> /home/myusername/test.stderr

Minha preferência é enviar a saída do cronjob para o syslog. Dessa forma, estou aproveitando qualquer infraestrutura existente de syslog (syslogs centralizados, Splunk, rotação de logs já suportada, é fácil comparar mensagens em / var / log / messages e / var / log / cronjob, etc), e não estou enviando spam para os administradores de sistema (eu) com emails desnecessários.

* * * * * echo hi >> /home/myusername/test 2>&1 | /usr/bin/logger -t mycronjob

2

Para mim, o problema era que o script não era executável. Eu tinha o crontab -e configurado assim

* * * * * /bin/my-script.sh

E o arquivo myscript não era executável, então eu corri

chmod +x my-script.sh

Imediatamente comecei a ver a saída conforme o esperado.


1

Sua linha cron funciona bem no meu computador quando mudo myusernaepara phunehehe. Existem várias maneiras de descobrir o que há de errado com seu sistema.

Geralmente, o Cron envia correio para o usuário quando há algo errado. Se você vir a mensagem "Você tem e-mail", use um cliente de e-mail para verificar sua caixa de entrada . Ou, verifique no seu diretório pessoal, pode haver um arquivo nomeado dead.letterlá.

Você pode verificar as /var/log/entradas relacionadas ao cron. No meu computador, o arquivo de log está em /var/log/cron/current(requer acesso root).

Se você tiver acesso root, poderá parar o daemon cron e iniciá-lo no modo de depuração. Por exemplo, eu usaria (mude fcronpara o nome do seu daemon):

killall fcron
fcron --foreground --debug

Como descubro o nome do meu daemon?
ripper234

@ ripper234 use ps -ef | grep crone você deverá ver uma linha para o seu cron. Verifique a página de manual do cron para ver o sinalizador para depuração. É provável que você esteja usando o Vixie Cron ; nesse caso, o sinalizador de depuração é -x. Mate o processo cron e inicie-o novamente com o sinalizador adicional.
phunehehe

Verifique também / var / log / syslog. No meu caso, houve avisos de que o arquivo cron era gravável em grupo.
trate seus mods bem

1

Provavelmente, quando o cron falha, ele gera um email para o ID do usuário do trabalho cron nesse computador. Se você não tiver um MTA funcionando no computador ou não estiver lendo ou encaminhando esse e-mail para outro lugar, não verá essa mensagem, mesmo que o MTA esteja funcionando.

Uma boa maneira de obter os erros do seu crontab via correio é fazer com que o seu crontab fique assim:

MAILTO="myemail@example.com"
* * * * * echo hi >> /home/myusernae/test

Obviamente, use seu endereço de e-mail em vez de myemail@example.com. Isso instrui o cron a enviar erros para o seu endereço de email em vez da conta local. Em particular, isso é útil se você tiver um crontab raiz (ou fragmento crontab no /etc/cron.d) que deseja enviar apenas para você, pode evitar a caixa de correio ou o endereço de encaminhamento de raiz do spam.


Não sei se o sistema tem um servidor de email SMTP / de saída configurado. As probabilidades são de que não.
ripper234

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.