Como solucionar problemas no cron job

0

Eu tenho um arquivo crontab root que se parece com isso:

lab-1:/var/www/cdd# crontab -l
# do daily/weekly/monthly maintenance
# min   hour    day     month   weekday command
*       *       *       *       *       /etc/scripts/script1
*/15    *       *       *       *       /etc/scripts/script2
0       *       *       *       *       /etc/scripts/script3

Eu posso ver que todos os trabalhos são acionados executando este comando:

lab-1:/var/www/cdd# cat /var/log/messages | grep cron.info
Mar 15 13:00:00 lab-1 cron.info crond[7897]: USER root pid 26217 cmd /etc/scripts/script2
Mar 15 13:00:00 lab-1 cron.info crond[7897]: USER root pid 26219 cmd /etc/scripts/script3        
Mar 15 13:01:00 lab-1 cron.info crond[7897]: USER root pid 26293 cmd /etc/scripts/script1     

O problema é que script3 (provei que script2 e script1 funcionam) não está realmente produzindo a saída esperada. É suposto criar arquivos em outra pasta. No entanto, quando eu executo manualmente assim, funciona muito bem:

 lab-1:/etc/scripts# bash script3

Eu não sou um administrador de sistemas real, então não tenho certeza de qual é a melhor maneira de resolver isso.

A primeira coisa que vem à mente é a permissão.

lab-1:/etc/scripts# ls -lah                            
total 24                                                                     
drwxr-xr-x    2 root     root        4.0K Mar 15 12:20 .                     
drwxr-xr-x   34 root     root        4.0K Mar 14 17:11 ..                    
-rwxr-xr-x    1 root     root        5.0K Mar 15 12:19 script3
-rwxr-xr-x    1 root     root        1.8K Mar 14 15:26 script1
-rwxr-xr-x    1 root     root        1.9K Mar 14 15:26 script2

Embora ... tendo dito isso, se fosse um problema de permissões, ele apareceria como acionado / iniciado no meu arquivo /var/log/messages ?

Como devo proceder?

EDIT 1

lab-1:/etc/scripts# ./script3 | head -n 4                                             
Working folder set to: /tmp/tmp.kOfhip                                                                        
*****Grab SQL Data from Remote Server: spp.mydomain.net *****                                             
COPY 344                                                                                                      
Warning: Permanently added 'spp.mydomain.net,10.1.1.1' (ECDSA) to the list of known hosts.           
Evaluate /tmp/tmp.kOfhip/spp.mydomain.net.db                                                          
lab-1:/etc/scripts#                                                                     

EDIT 2

É assim que meu script se parece:

link

Como você pode ver, estou criando uma pasta temporária e fazendo todo o meu trabalho lá.

EDIT 3

Para provar para mim mesmo que não é por causa de linhas como a linha 9, eu comentei tudo, exceto as linhas 1 e 15. Adicionei a linha 16 que faz isso:

 echo "done" >> /tmp/results.txt

Depois alterei o horário do trabalho para ser executado a cada dois minutos a partir de uma hora. Eu posso ver que ele é executado 3 vezes já. Acho que continuarei com essa abordagem até encontrar algo que não funcione / exploda. Eu não entendo muito bem o comentário feito abaixo sobre o uso de uma variável PATH ... mas eu acho que vou pesquisar no Google.

EDIT 4

Eu alterei o arquivo raiz crontabs para que ele produza os resultados do script3 em um arquivo e é isso que eu vejo:

Working folder set to: /tmp/tmp.GeNGDJ
*****Grab SQL Data from Remote Server: servername *****
COPY 344
Warning: Permanently added 'spp.mydomain.net,10.1.1.132' (ECDSA) to the list of known hosts.
Permission denied (publickey,keyboard-interactive).
Evaluate /tmp/tmp.GeNGDJ/spp.mydomain.net.db
cat: can't open '/tmp/tmp.GeNGDJ/spp.mydomain.net.db': No such file or directory

Então está morrendo ao tentar scp o arquivo. O SQL remoto funciona muito bem e mostra a saída. Mas como você pode ver, estou recebendo uma permissão negada Mas se eu executar o mesmo comando manualmente, parece funcionar. Vai ter que continuar bisbilhotando. Vai tentar despejar o ENV como é sugerido na resposta abaixo.

    
por dot 15.03.2018 / 14:08

1 resposta

2

Um erro comum ao escrever scripts que serão executados posteriormente pelo cron, é que você assume que o script terá exatamente o mesmo ambiente que você tem quando está logado e o está desenvolvendo. Não tem!

Escreva um script4 que contenha a seguinte linha

OFILE=/tmp/crons.environment
(/usr/bin/whoami
/usr/bin/env ) > $OFILE 2>&1

E faça o cron rodar isso

Agora compare a saída em /tmp/crons.environment com o que você recebe quando basta digitar env

Seu script assume, por exemplo, que $ PATH está configurado corretamente para encontrar todos os programas que você executa, você também está consultando um banco de dados, pode haver outras variáveis de ambiente necessárias para que esses comandos sejam executados corretamente.

Para verificar a saída do trabalho cron. Modifique temporariamente o comando executado pelo cron e redirecione stdout e stderr para um arquivo conhecido, como fiz acima.

0       *       *       *       *       /etc/scripts/script3 > /tmp/s3.out 2>&1
    
por 15.03.2018 / 14:53