我编写了一个 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 脚本环境。

10-07 19:15
查看更多