El script se ejecuta manualmente pero no desde cron

El script se ejecuta manualmente pero no desde cron

Según el seguimiento de mi estado de replicación de MySQL. Escribí un script de shell simple con el siguiente 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

El problema es que cuando ejecuto este script manualmente funciona bien, pero al usar cron el script no funciona.

Al usar cron, recibí el correo solo con la salida del comando de fecha. ¿Qué le pasa a mi lado?

Respuesta1

Varias posibilidades:

  1. Cron no pasa un entorno de usuario completo a los scripts que se ejecutan en cron. Por lo tanto, variables como $PATH pueden ser diferentes si se ejecutan bajo cron que si se ejecutan en una terminal de usuario.

  2. Cron requiere una nueva línea al final de cada línea, por lo tanto, mantenga siempre una línea en blanco al final del archivo crontab.


Tal vez especifique las rutas completas en el script y vea si funciona para empezar.

#!/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

Respuesta2

Los trabajos cron se ejecutan con muy poco contexto. Si tiene un .my.cnfarchivo en su directorio de inicio, podría contener los detalles de autenticación necesarios para que el mysqlcomando funcione. Probablemente también necesite la ruta completa para mailver qué which mailse imprime.

Respuesta3

En lugar de escribir la ruta completa para cada comando, sería útil establecer PATHuna variable en el archivo de secuencia de comandos.

#!/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`

Respuesta4

usarbash -l -c

p.ej:

* * * * * bash -l -c '/dsds/fddfd/something.sh' > /tmp/something.log

información relacionada