Shell脚本问题:cron作业脚本在意外停止时重新启动MySQL服务器


11

我有这个脚本,我正在使用它来设置CRON作业以执行该脚本,因此它可以检查MySQL服务是否正在运行;如果没有,则重新启动MySQL服务:

#!/bin/bash
service mysql status| grep 'mysql start/running' > /dev/null 2>&1
if [ $? != 0 ]
then
    sudo service mysql restart
fi

我已经设置了cron工作。

sudo crontab -e

然后添加

*/1 * * * * /home/ubuntu/mysql-check.sh

问题是它在每次执行cron作业时都会重新启动MySQL。即使服务器正在运行,它也会重新启动MySQL服务,脚本中的更正是这样做。


为什么在shebang前面有一个“ \”?如果有它可以防止其看起来像评论,那么就没有必要了。 Shebangs当Bash特殊处理等等,在它们不需要被转义,因为他们不是在这个意义上评论说,评论是一段代码,该代码也没有评估在所有
Alexej Magura 2014年

1
另外,请避免在Bash中使用[ ... ]test <TEST>。他们已弃用语法。使用[[ ... ]]代替。仅使用[ ... ]和/或test <TEST>[[ ... ]]没有用。
Alexej Magura 2014年

1
这是我使用一些可用脚本尝试过的第一个shell脚本,我刚刚对其进行了修改。对语法了解不多。问题仍然存在,每个CRON作业执行时mysql重新启动@AlexejMagura
Straw Hat

1
尝试这样的操作:if ! (service mysql status | grep 'mysql start/running' &>/dev/null); then sudo service mysql restart; fi 它是启动一个子外壳程序,service mysql status | grep 'mysql start/running' &> /dev/null运行该子外壳程序,然后将该子外壳程序的返回(退出)状态传递给if语句,然后再检查它是否为非零值,如果它不是非零,那么它将运行该then块。
Alexej Magura 2014年

mysql不会将其进程pid写入pid文件吗?如果这样做,您可以将其用作检查mysql状态的另一种方法
Flint 2014年

Answers:


18

我怀疑您将cron作业设置为在crontab文件中而不是在crontab根文件中执行此脚本。这是不正确的,因为如果您没有service mysql status以root用户身份运行,则该mysql服务将不会被识别。

因此,如下修改脚本:

#!/bin/bash
if [[ ! "$(/usr/sbin/service mysql status)" =~ "start/running" ]]
then
    /usr/sbin/service mysql start
fi

确保可执行文件:

chmod +x /path/to/script

然后在根crontab中添加一个新条目,如下所示:

  • 使用以下命令编辑crontab根文件:

    sudo crontab -e
  • 并将以下行添加到文件中:

    */1 * * * * /path/to/script
  • 注意:我为每分钟设置了cron作业,但是您可以根据自己的意愿或认为更好的方式进行更改。在这种意义上,请参见http://en.wikipedia.org/wiki/Cron


我将其设置为crontab,我猜问题出在脚本上,我将尝试上面的脚本
Straw Hat

./mysql-check.sh: line 2: [: =~: binary operator expected以上脚本中的错误
Straw Hat

我相信!如果您实际上打算在崩溃时重新启动mysql服务,则想与该正则表达式匹配否定
Flint 2014年

@Flint也是这样……对不起,我还在喝我的早晨咖啡。:)
RaduRădeanu2014年

@D_Vaibhavツ现在应该一切正常。因此,现在以根用户身份尝试。
RaduRădeanu2014年

3

拉杜的回答几乎奏效。我必须设置使其工作的路径:

#!/bin/bash
PATH=/usr/sbin:/usr/bin:/sbin:/bin
if [[ ! "$(service mysql status)" =~ "start/running" ]]
then
    service mysql start
fi

1
实际上,我已经PATH在crontab文件中设置了。无论如何,就您而言,在我编辑答案时,您需要使用PATH=/usr/sbin:$PATH或使用完整路径service
RaduRădeanu2014年

2

Radu的答案有效-但此脚本也适用

#!/bin/bash
if [[ $(pgrep mysql | wc -l) = 0 ]];
then
    sudo service mysql start;
fi

我检查了pgrep mysql,我得到0了mysql正在停止2运行的信息。因此,我将条件设置为if [[ $(pgrep mysql | wc -l) = 0 ]];,它对我有用。
Alin C '18年

可能会更好...我会进行更改。
JxAxMxIxN

该脚本适用于/bin/bash(没有bash不能使用)。*/1 * * * * /bin/bash /root/mysql-check.sh
mahfuz 19'Apr
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.