O Cron parece rodar, mas não é executado da mesma maneira que quando executado manualmente a partir do terminal [duplicado]

3

Eu tenho um script php que se conecta a uma API externa que retorna alguns dados e atualiza uma tabela de banco de dados. Eu posso executar isso diretamente através da minha linha de comando / terminal SSH e funciona bem (leva cerca de 5 minutos para ser concluído).

Usando crontab eu tenho 'cronned' este script para que ele seja executado a cada três horas usando o comando abaixo:

0 */3 * * * /usr/bin/php /var/acme/cron/api_update_db.php

Usando o syslog eu posso ver que este cron foi executado, mas parece que o cron está realmente rodando a cada três horas como esperado, no entanto, o banco de dados não parece ter sido atualizado? Mas quando eu executo exatamente o mesmo script manualmente, navegue para o diretório & digitando o seguinte ele roda (e atualiza o DB)

php api_update_db.php

Haveria um motivo para essa execução ser diferente quando executada a partir do cron job, quando executada manualmente a partir do terminal (o que parece funcionar)?

    
por Zabs 03.02.2016 / 17:06

3 respostas

4

Você pode estar obtendo alguma saída stderr \ stdout que pode ajudar a identificar o problema. Normalmente, isso acaba sendo enviado para você mesmo, mas se não tentar adicionar um redirecionamento específico de todas as saídas ao final da entrada do seu crontab em um arquivo, por exemplo:

0 */3 * * * /usr/bin/php /var/acme/cron/api_update_db.php &> /tmp/cron.output
    
por 03.02.2016 / 17:22
3
crontab -u <username> -e 

A resposta curta, execute o cron como um usuário com as credenciais apropriadas para o banco de dados. Source

    
por 03.02.2016 / 17:15
1

Dependendo da versão / tipo do cron que você está usando, a saída do comando geralmente é enviada via e-mail para alguém. No estilo tradicional você pode colocar

MAILTO=your.login

ou talvez até

[email protected]

e obtenha a saída do script.

No pior dos casos, tente

0 */3 * * * /usr/bin/php /var/acme/cron/api_update_db.php > /tmp/cron.output 2> /tmp/cron.error

Usar &> provavelmente não funcionará também - o cron executa usando /bin/sh , o que provavelmente não é bash e &> não está no padrão POSIX, é uma extensão bash (possivelmente assumida também por outras conchas, mas não todas elas).

Outra coisa para procurar é que isso seja executado sem qualquer uma das variáveis de ambiente, etc. Então, se você tiver credenciais para o DB definido como variável de ambiente em .bashrc , isso não funcionará.

    
por 03.02.2016 / 23:23