Cron: Por que meus scripts cron não estão funcionando mesmo que o cron esteja rodando?

2

Eu tenho um 4 scripts para transferir banco de dados de um servidor para outro para fins de teste. Esses scripts são executados automaticamente durante a noite. Quando eu chamo os scripts manualmente, não recebo nenhum erro, mas sem executá-los manualmente, não consigo ver nenhum dado sendo transferido.

Servidor 1:

ps -ef | grep cron
root      2350     1  0 Apr23 ?        00:00:26 /usr/sbin/cron
root     14293  9533  0 10:52 pts/4    00:00:00 grep cron

Servidor 2:

ps -ef | grep cron
root     11269  8661  0 10:52 pts/1    00:00:00 grep cron
root     21726     1  0 Jan30 ?        00:00:31 /usr/sbin/cron

Servidor 1

crontab -e
# m h  dom mon dow   command
0 3 * * * /home/deploy/scripts/clearzip.sh
19 2 * * * /media/attachment/send_db.sh

send_db.sh

#! /bin/bash
pg_dump -C "DB_NAME" | bzip2 | sshpass -v ssh user@server2 "bunzip2 | psql "DB_NAME""
pg_dump -C "DB2" | bzip2 | sshpass -v ssh user@server2 "bunzip2 | psql "DB2""

Servidor2:

# m h  dom mon dow   command
12 2 * * * ./home/postgres/stop_services.sh
17 2 * * * ./home/postgres/dropdb.sh
55 5 * * * ./home/postgres/start_services.sh

stop_services.sh:

#! /bin/bash
echo > >(tee -i /home/deploy/logfile.txt)
sh /home/deploy/tomcat7/bin/catalina.sh stop
killall java
killall screen

dropdb.sh

su -c "psql -c 'drop database "DB1";'" -s /bin/sh postgres
su -c "psql -c 'create database "DB1";'" -s /bin/sh postgres
su -c "psql -c 'drop database "DB2";'" -s /bin/sh postgres
su -c "psql -c 'create database "DB2";'" -s /bin/sh postgres

O que eu posso estar fazendo errado? Alguma ideia?

Atualizar

Erros no arquivo de log

could not change directory to "/root": Permission denied
could not change directory to "/root": Permission denied
could not change directory to "/root": Permission denied
could not change directory to "/root": Permission denied
/home/postgres/start_services.sh: line 5: service: command not found
/home/postgres/start_services.sh: line 6: service: command not found
    
por We are Borg 22.09.2017 / 11:05

1 resposta

3

Eu vejo dois problemas:

  1. Você está executando coisas que precisam de privilégios de root, mas estão sendo executadas como um usuário comum.

  2. Você está usando nomes de comandos sem o PATH completo e, portanto, a sessão aberta pelo cron não sabe onde encontrá-los.

Para corrigir 1., não use crontab -e e, em vez disso, edite /etc/crontab ou, ainda mais simples, execute sudo crontab -e para adicioná-lo ao crontab do root. Em seguida, edite seu dropdb.sh e remova o su (o script agora será iniciado pelo root, portanto, não há necessidade de su ).

Para corrigir 2, a abordagem mais simples seria definir o PATH no crontab. Deve ficar assim:

PATH=/bin:/sbin:/usr/sbin:/usr/local/sbin:/usr/local/bin:/usr/bin
# m h  dom mon dow   command
12 2 * * * ./home/postgres/stop_services.sh
17 2 * * * ./home/postgres/dropdb.sh
55 5 * * * ./home/postgres/start_services.sh

Como alternativa, edite seus scripts e verifique se todos eles usam caminhos absolutos (portanto, /usr/sbin/service em vez de service ).

    
por 22.09.2017 / 17:11