Что касается мониторинга моего статуса репликации 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
Несколько возможностей:
Cron не передает полную пользовательскую среду скриптам, запущенным под cron. Поэтому переменные типа $PATH могут отличаться при запуске под cron от запуска в пользовательском терминале.
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