O script é executado manualmente, mas não no cron

O script é executado manualmente, mas não no cron

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:

  1. 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.

  2. 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.cnfarquivo em seu diretório inicial, ele poderá conter os detalhes de autenticação necessários para que o mysqlcomando funcione. Você provavelmente também precisará do caminho completo para mailver o que which mailé impresso.

Responder3

Em vez de escrever o caminho completo para cada comando, seria útil definir PATHa 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

informação relacionada