De acordo com o monitoramento do meu status de replicação mysql. Eu escrevi um script de shell simples com o seguinte código
#!/bin/bash
date > /tmp/mysql_repl_status.txt
cd /usr/bin/
"/usr/bin/mysql" "-e" "SHOW SLAVE STATUS \G" >> /tmp/mysql_repl_status.txt
mail -s "Netspective MySQL replication status" [email protected] < /tmp/mysql_repl_status.txt
O problema é que quando executo esse script manualmente ele funciona bem, mas usando o cron o script não funciona.
Usando o cron, recebi o e-mail apenas com a saída do comando date. O que há de errado com o meu lado?
Responder1
Várias possibilidades:
O Cron não passa um ambiente de usuário completo para scripts executados no cron. Portanto, vars como $PATH podem ser diferentes da execução no cron e da execução em um terminal de usuário.
O Cron requer uma nova linha no final de cada linha, portanto, mantenha sempre uma linha em branco no final do arquivo crontab.
Talvez especifique os caminhos completos no script e veja se isso funciona para começar.
#!/bin/bash
statfile=/tmp/mysql_repl_status.txt
/bin/date > $statfile
cd /usr/bin
/usr/bin/mysql -e "SHOW SLAVE STATUS \G" >> $statfile
/bin/mail -s "Netspective MySQL Replication Status" [email protected] < $statfile
Responder2
Os cron jobs são executados com muito pouco contexto. Se você tiver um .my.cnf
arquivo em seu diretório inicial, ele poderá conter os detalhes de autenticação necessários para que o mysql
comando funcione. Você provavelmente também precisará do caminho completo para mail
ver o que which mail
é impresso.
Responder3
Em vez de escrever o caminho completo para cada comando, seria útil definir PATH
a variável no próprio arquivo de script
#!/bin/bash
export PATH=/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
date > /tmp/mysql_repl_status.txt
cd /usr/bin/
"/usr/bin/mysql" "-e" "SHOW SLAVE STATUS \G" >> /tmp/mysql_repl_status.txt
mail -s "Netspective MySQL replication status" [email protected] <
/tmp/mysql_repl_status.txt`
Responder4
usarbash -l -c
por exemplo:
* * * * * bash -l -c '/dsds/fddfd/something.sh' > /tmp/something.log