![脚本手动运行,但不是从 cron 运行](https://linux22.com/image/38437/%E8%84%9A%E6%9C%AC%E6%89%8B%E5%8A%A8%E8%BF%90%E8%A1%8C%EF%BC%8C%E4%BD%86%E4%B8%8D%E6%98%AF%E4%BB%8E%20cron%20%E8%BF%90%E8%A1%8C.png)
根据我的 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
几种可能性:
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