Shell 脚本问题:当 MySQL 服务器意外停止时,cron 作业脚本用于重新启动它

Shell 脚本问题:当 MySQL 服务器意外停止时,cron 作业脚本用于重新启动它

我有这个脚本,我正在用它来设置 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 服务,脚本中的更正是什么可以做到这一点。

答案1

我怀疑你在 crontab 文件中设置了 cron 任务来执行此脚本,而不是在根 crontab 文件中。这是不正确的,因为如果你以 root 身份运行service mysql status,该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在这个意义上。

答案2

Radu 的答案几乎奏效了。我必须设置路径才能使其工作:

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

答案3

Radu 的答案有效 - 但这个脚本也有效

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

答案4

重新开始

使用 systemd,你可以将服务设置为Restart在某些条件下:

systemctl cat mysql.service | grep Restart     # Check current status. cat PATTERN... Show files and drop-ins of specified units

您可能希望从 移动on-aborton-failure部分[Service]

sudo EDITOR=nano systemctl edit mysql.service

其他有用的命令:

sudo systemctl daemon-reload  # Reload systemd manager configuration. `systemctl edit` automatically does this for you.
systemctl cat mysql.service   # unit configuration
systemd-delta                 # Check the whole system changes

OOMScoreAdjust

在同一位置,您可能还想调整 systemdOOMScoreAdjust

设置 Linux 内核针对已执行进程的内存不足 (OOM) 终止分数的调整值。取一个介于 -1000(禁止 OOM 终止此单元的进程)和 1000(使在内存压力下终止此单元的进程成为可能)之间的整数。

# Useful options not previously available in [mysqld_safe]

# Kernels like killing mysqld when out of memory because its big.
# Lets temper that preference a little.
# OOMScoreAdjust=-600

另请阅读这个优秀的答案


您还可以通过调整一些选项(如max_connectionsinnodb_buffer_pool_sizeinnodb_buffer_pool_instances(可能/etc/mysql/mariadb.conf.d/50-server.cnf))来减少 MySQL/MariaDB 的内存使用量。

相关内容