编写ubuntu关键服务守护脚本(mysql,ubuntu)

背景:

最近发现mysql服务经常就error了,而且由于很忙没有及时去看导致网站一连好几天甚至好几周都没办法访问, 只能等到发现了登录服务器手动重启mysql,这种情况经常发生,总会有不及时的时候,当时就在想有没有可能写一个脚本在服务器端自动运行,只要服务器还开着就可以在mysql等关键服务异常或者停止的时候自动重启,这不就开始折腾了。

实现:

之前其实是写了一个守护mysql进程的脚本,但是ubuntu升级之后这个脚本似乎就没有效果了,只能重新再写一个了,关键怎么写呢?开始的开始我们需要看一下我们需要守护服务的状态,这里以mongodb为例

用过ubuntu的朋友应该都知道,我们可以通过命令

service mongodb status

来查看mongodb的运行状态

正常运行状态的截图:

停止的状态的截图:

失败的这里就没有截图了,总之我们看出正常的有关键字running,其他状态不会有关键字running,我们就可以以这个为切入点去做,结合一些其他知识,我们可以写出一个简单的守护命令:

service mongodb status > /dev/null || service mongodb restart

这个命令在控制台敲,一点问题都没有,堪称完美,但是如果你把它放大cronjob中去自动执行,会发现一个惊人的结果,一点鸟用都没有,为什么呢?这里就涉及到cron环境变量的问题了,为了避免这个问题,我们应该使用全路径修改如下:

/usr/sbin/service mongodb status > /dev/null || /usr/sbin/service mongodb restart

service的路径有可能是/bin/service,也有可能是/usr/sbin/service, 我们可以通过命令

which service

来确定路径

然后我们设置当时任务,运行命令:

crontab -e

我们设置为每1分钟检测一次:

*/1 * * * * /usr/sbin/service mongodb status > /dev/null || /usr/sbin/service mongodb restart

然后重启cron服务

service cron restart

这个时候如果我们停掉mongodb服务,

service mongodb stop

过一小段时间,你会发现mongodb服务又起来了。

优化:

上面的守护命令虽然实现了功能,但是还是相对比较简单,如果我们需要在mysql等关键服务异常或停止的时候以邮件或者短信或者微信告知到我们呢?我们可以这样做:

if ! /usr/sbin/service nginx status | grep -q 'running'; then
	filename=$(date +%Y%m%d)
	# 这里做消息通知 邮件/短信/微信
	echo "at `date` nginx is errored!" >> /var/shell/log/nginx_${filename}.log
	/usr/sbin/service nginx restart
fi

好了,本文到这里就结束了,真心希望大家能持续关注本博客,虽然我有时候会忙到没有时间来更新博客,但是一有时间我就会来更新!!!

  • 支付宝二维码 支付宝
  • 微信二维码 微信
相关文章