nginx/mysqld服务异常停止自动重启shell脚本

在之前的文章中,我们介绍了如何利用shell脚本来防止服务器被ssh暴力登录:Linux服务器防SSH暴力登录脚本》,本文我们将继续介绍shell脚本的一些其他应用。

对于一些配置不怎么好甚至就是低配的入门级服务器来说,服务器可能时不时就会抽风,比如nginx服务挂了,mysql服务挂了等等,而nginx或mysql服务的挂起将直接导致我们的网站没办法向用户正常提供服务,保持服务的稳定可能是使用低配服务器的第一要务,我们没办法时时刻刻去关注服务器的运行状态,所以我们得考虑使用一些方式来帮助我们保持服务器的稳定。

本文将介绍使用shell脚本监测重要服务的运行状态并在异常时自动重启,配合计划任务保证服务的稳定。

脚本1:

#! /usr/bin/env bash

services="mysqld nginx"

for i in ${services}; do
  pgrep ${i} >> /dev/null 2>&1
  if [ $? -ne 0 ]; then
    # 在这里可以通知管理员
    service ${i} restart >> /dev/null 2>&1
    echo "服务 ${i} 于 `date +"%Y-%m-%d %H:%M:%S"` 异常停止,现已重启成功!"
  fi;
done

在上面的脚本中, services定义了我们需要监测的服务,然后循环每一个服务并通过pgreg命令查找指定服务的进程,然后判断pgrep命令执行后的退出状态$?,如果为0则说明找到了进程,如果其他值则没有找到,说明服务没运行,需要重启。

脚本2:

#! /usr/bin/env bash

services="mysqld nginx"

for i in ${services}; do
  ps -ef | grep ${i} | grep -vq grep
  if [ $? -ne 0 ]; then
    # 在这里可以通知管理员
    service ${i} restart >> /dev/null 2>&1
    echo "服务 ${i} 于 `date +"%Y-%m-%d %H:%M:%S"` 异常停止,现已重启成功!"
  fi;
done

脚本2和脚本1其实没什么差别,只是查找进程的方式换了一下,我们通过ps -ef命令列出进程列表,并利用grep命令筛选出指定服务的进程,然后grep -v grep排除掉grep自身进程,grep -q表示安静模式,不打印任何标准输出。

在上面两个脚本中我们可以看出pgrepps命令的区别,可以简单描述如下:

pgrep name
等价于
ps -e | grep name | awk '{print $1}'

脚本3:

#! /usr/bin/env bash

# for nginx
service nginx status | grep -q running
if [ $? -ne 0 ]; then
  # 在这里可以通知管理员
  service nginx restart >> /dev/null 2>&1
  echo "服务 nginx 于 `date +"%Y-%m-%d %H:%M:%S"` 异常停止,现已重启成功!"
fi;

#for mysqld 
service mysqld status >> /dev/null 2>&1
if [ $? -ne 0 ]; then
  # 在这里可以通知管理员
  service mysqld restart >> /dev/null 2>&1
  echo "服务 mysqld 于 `date +"%Y-%m-%d %H:%M:%S"` 异常停止,现已重启成功!"
fi;

在上面的脚本中,我们单独处理了nginxmysqld服务的异常检测和重启,分别利用了各自服务的特性来进行检测。

以上脚本均已在centos上测试通过,大家可以根据自己的喜好选择合适的脚本并保存为serviceGuard.sh,然后使用cronjob定时运行shell脚本。

*/2 * * * *  serviceGuard.sh >> /var/log/serviceGuard.log 2 > &1

答应我,从现在开始,将你的服务器武装起来,善用shell脚本或其他方案让我们的网站服务更加稳定。

  • 支付宝二维码 支付宝
  • 微信二维码 微信

本文地址: /service-restart.html

版权声明: 本文为原创文章,版权归 逐梦个人博客 所有,欢迎分享本文,转载请保留出处!

相关文章