Verifique se o crontab funciona

82

Quero verificar se um determinado crontab funciona corretamente. Eu adicionei um trabalho como este:

  */2 * * * * /path_to_my_php_script/info.php >/dev/null 2>&1

Eu sei que redireciono para o dispositivo nulo, mas não tenho certeza se o comando acima é bom.

* Editar 1: No meu / var / log / syslog a cada dois minutos, tenho o seguinte erro:

 (CRON) error (grandchild #2788 failed with exit status 2)

* Edição 2: sem erros nos logs com este novo trabalho:

 */2 * * * * /usr/bin/php /path_to_my_php_script/info.php >/dev/null 2>&1
croppio.com
fonte
infelizmente tudo acima tentou mas não funciona para mim. como você diz que a tentativa / bin / sh -c "(PATH de exportação = / bin; /tmp/trial.sh </ dev / null)" mostra a mensagem abaixo, sem ter certeza do que é / bin / sh: PATH = / bin : não é um identificador

Respostas:

73

A sintaxe da entrada crontab parece correta. De fato, se você editar seu crontab usando " crontab -e" (como deveria), receberá um erro se especificar uma entrada sintontática inválida do crontab de qualquer maneira.

  1. Em primeiro lugar, é /path_to_my_php_script/info.phpexecutado corretamente a partir da linha de comando?

  2. Em caso afirmativo, ele também funciona corretamente assim:

    /bin/sh -c "(export PATH=/usr/bin:/bin; /path_to_my_php_script/info.php </dev/null)"
    
  3. Se isso funciona, funciona assim?

    /bin/sh -c "(export PATH=/usr/bin:/bin; /path_to_my_php_script/info.php </dev/null >/dev/null 2>&1)"
    

O passo (3) é semelhante ao modo como o cron executará seu programa (conforme documentado em "man 5 cron".

O problema mais provável que você está tendo é que o cron PATH está usando para executar seu programa é muito restritivo. Portanto, você pode adicionar algo como o seguinte na parte superior da sua entrada crontab (você precisará adicionar os diretórios que seu script precisar):

PATH=~/bin:/usr/bin/:/bin

Observe também que o cron usará por padrão /bin/sh, e não o bash. Se você precisar do bash, adicione-o também ao início do seu arquivo crontab:

SHELL=/bin/bash

Observe que ambas as alterações afetarão todas as entradas do crontab. Se você quiser modificar esses valores para o seu info.phpprograma, faça algo assim:

*/2 * * * * /bin/bash -c ". ~/.bashrc; /path_to_my_php_script/info.php"

Também vale mencionar que em um sistema configurado para "correio" (em outras palavras, um sistema com um MTA configurado [sendmail / postfix / etc]), toda a saída dos programas crontab é enviada automaticamente por e-mail. Um sistema desktop padrão do Ubuntu não terá o correio local configurado, mas se você estiver trabalhando em um servidor, basta digitar "mail" em um terminal para ver todos os cron mails. Isso também se aplica ao atcomando " ".

jamesodhunt
fonte
2
Recebo permissão negada para o segundo passo. O que devo fazer?
akikara
@akikara chmod + x ./cron.sh - obviamente substituir ./cron.sh com qualquer que seja o local do seu arquivo é que você está tentando executar
Tisch
46

Embora muito raro, às vezes o cron para de funcionar corretamente, mesmo que o serviço esteja em execução. Aqui está como verificar se o crond está em execução e parar / iniciar o serviço.

No Linux:

service crond status
service crond stop
service crond start

No Ubuntu e outros sistemas baseados no Debian:

service cron status
service cron stop
service cron start
user53817
fonte
13
Apenas uma nota ... para o Ubuntu é cron, nãocrond
Amit Kohli
32

Não redirecione a saída de erro para / dev / null e grep / var / log / syslog para a saída cron.

grep cron /var/log/syslog

Você pode mostrar imediatamente erros ao salvar um arquivo após a edição /etc/crontabou os arquivos internos /etc/cron.d/com:

tail -f /var/log/syslog | grep --line-buffered cron

Se a edição estiver correta, você verá apenas o RELOADaviso, ocorrerão erros como

Jul 9 09:39:01 vm cron[1129]: Error: bad day-of-month; while reading /etc/cron.d/new 
rubiojr
fonte
19

Você pode ver seu cron ativo com o comando terminal:

crontab -l

Aqui estão os parâmetros em ordem:

  1. min (0 - 59)

  2. hora (0 - 23)

  3. dia do mês (1-31)

  4. mês (1-12)

  5. dia da semana (0 - 6) (domingo = 0)

  6. comando

Então, você está chamando seu script a cada primeiro minuto de cada hora. Você deve testar sua saída com mais frequência para fins de teste:

* * * * * <command> #Runs every minute

Isso será chamado a cada minuto!

bioShark
fonte
* / 2 * * * * eu mudei para a cada dois minutos agora
croppio.com 6/12/11
11

Para a parte do tempo em cada linha, você pode usar esse cron testador para testar / verificar sua definição de tempo do cron.

Ashish Karpe
fonte
Essa é uma boa sugestão.
Rahil Wazir
2
também útil: crontab-generator.org
rubo77 4/17
2

Eu acredito que você também pode usar run-partspara executar trabalhos cron fora de banda. Na verdade, é o que o cron usa para executar os trabalhos periódicos do cron; portanto, fornecendo os argumentos apropriados, você pode executá-los a qualquer momento.

Se você deseja apenas executar um arquivo em vez de todos os trabalhos cron definidos em, por exemplo, /etc/cron.dailyvocê precisará fornecer o argumento regex junto com um regex válido.run-parts --list --regex '^p.*d$' /etc

Lembre-se de que os trabalhos cron geralmente são nomeados sem uma extensão e marcados como executáveis; portanto, verifique se seus scripts são semelhantes, embora o uso de uma expressão regular possa permitir que você ative um script com uma extensão.

dragon788
fonte
1

ah !!

obtive a resposta, verifiquei e não encontrei cronddentro do diretório de instalação padrão, ou seja,/etc/init.d/

agora tentará responder.

nota - ENTENDI check a cron.allow, cron.denytambém. Tudo está bem até agora.

luckbychance
fonte