我有这个脚本,我正在用它来设置 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-abort
到on-failure
部分[Service]
。
sudo EDITOR=nano systemctl edit mysql.service
nano
或者任何你想要的编辑器。- 若要进行此临时使用
--runtime
,更改将在下次重启时丢失。 - 添加
RestartSec=
重新启动服务之前先休眠。
其他有用的命令:
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_connections
、innodb_buffer_pool_size
和innodb_buffer_pool_instances
(可能/etc/mysql/mariadb.conf.d/50-server.cnf
))来减少 MySQL/MariaDB 的内存使用量。