脚本手动运行,但不是从 cron 运行

脚本手动运行,但不是从 cron 运行

根据我的 mysql 复制状态的监控。我用以下代码编写了一个简单的shell脚本

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

相关内容