Скрипт запускается вручную, а не из cron

Скрипт запускается вручную, а не из cron

Что касается мониторинга моего статуса репликации mysql. Я написал простой скрипт оболочки со следующим кодом

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

Проблема в том, что когда я запускаю этот скрипт вручную, он работает нормально, но при использовании cron скрипт не работает.

Используя cron получил почту с выводом только команды date. Что не так с моей стороны?

решение1

Несколько возможностей:

  1. Cron не передает полную пользовательскую среду скриптам, запущенным под cron. Поэтому переменные типа $PATH могут отличаться при запуске под cron от запуска в пользовательском терминале.

  2. Cron требует добавления новой строки в конце каждой строки, поэтому всегда оставляйте пустую строку в конце файла crontab.


Может быть, стоит указать полные пути в скрипте и посмотреть, сработает ли это для начала.

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

решение2

Задания Cron запускаются с очень небольшим контекстом. Если у вас есть файл .my.cnfв домашнем каталоге, он может содержать данные аутентификации, необходимые для mysqlработы команды. Вам, вероятно, также понадобится полный путь mail— посмотрите, что which mailвыведется.

решение3

Вместо того, чтобы писать полный путь для каждой команды, было бы полезно задать PATHпеременную в самом файле скрипта.

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

решение4

использоватьbash -l -c

например:

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

Связанный контент