我编写了一个 shell 脚本,它在 MySQL 被终止/终止时启动它。我正在使用 crontab 运行这个 shell 脚本。
我的 cron 在/root/mysql.sh 下寻找名为 mysql.sh 的脚本文件
sh /root/mysql.sh
mysql.sh:
cd /root/validate-mysql-status
sh /root/validate-mysql-status/validate-mysql-status.sh
验证-mysql-status.sh:
# mysql root/admin username
MUSER="xxxx"
# mysql admin/root password
MPASS="xxxxxx"
# mysql server hostname
MHOST="localhost"
MSTART="/etc/init.d/mysql start"
# path mysqladmin
MADMIN="$(which mysqladmin)"
# see if MySQL server is alive or not
# 2&1 could be better but i would like to keep it simple
$MADMIN -h $MHOST -u $MUSER -p${MPASS} ping 2>/dev/null 1>/dev/null
if [ $? -ne 0 ]; then
# MySQL's status log file
MYSQL_STATUS_LOG=/root/validate-mysql-status/mysql-status.log
# If log file not exist, create a new file
if [ ! -f $MYSQL_STATUS_LOG ]; then
cat "Creating MySQL status log file.." > $MYSQL_STATUS_LOG
now="$(date)"
echo [$now] error : MySQL not running >> $MYSQL_STATUS_LOG
else
now="$(date)"
echo [$now] error : MySQL not running >> $MYSQL_STATUS_LOG
fi
# Restarting MySQL
/etc/init.d/mysql start
now1="$(date)"
echo [$now1] info : MySQL started >> $MYSQL_STATUS_LOG
cat $MYSQL_STATUS_LOG
fi
当我使用 webmin 的 crontab 手动运行上述 mysql shell 脚本时,MySQL 成功启动 (当它被杀死时)。
但是,当我使用 cron 作业安排 时,MySQL 不会启动。 日志打印正确(这意味着我的 cron 成功运行了预定脚本,但是 MySQL 没有重新启动)。
crontab -l 显示:
* * * * * sh /root/mysql.sh
我从 URL 中发现,我们应该通过像 cron 这样的调度程序提供绝对路径来重新启动 MySQL。但是,它对我不起作用。
谁能帮帮我吗!
谢谢你。
最佳答案
首先,crontab 通常看起来像这样:
* * * * * /root/mysql.sh
所以删除多余的
sh
并将其放在脚本的开头 - #!/bin/bash
我想(为什么你指的是 sh
而不是 bash
?)并且不要忘记对文件( chmod +x /root/mysql.sh
)有执行权限其次,在 crontab 中运行脚本很棘手,因为环境不同!您必须手动设置它。我们从 PATH 开始:转到控制台并执行
echo $PATH
,然后将结果复制粘贴到 export PATH=<your path>
到您的 cron 脚本中:mysql.sh:
#!/bin/bash
export PATH=.:/bin:/usr/local/bin:/usr/bin:/opt/bin:/usr/games:./:/sbin:/usr/sbin:/usr/local/sbin
{
cd /root/validate-mysql-status
/root/validate-mysql-status/validate-mysql-status.sh
} >> OUT 2>> ERR
请注意,我还将所有输出重定向到文件,以便您不会收到来自 cron 的电子邮件。
问题是如何知道哪些其他变量(除了
PATH
)很重要。尝试通过 set | less
并尝试找出在 cron 脚本中设置哪些变量可能也很重要。 如果有MYSQL相关的变量,一定要设置! 您还可以通过将 set > cron.env
放入 cron 脚本,然后将其与控制台环境进行比较以查找显着差异来检查 cron 脚本环境。