centos中shell定时检测mysqld,nginx,httpd服务脚本

前几天发现网站打不开,提示数据库连接错误,我登录linux 发现mysqld服务不知道什么时候停止了。幸好我即使发现。
于是决定写一个shell脚本每分钟自动检测mysqld服务,如果发现服务没起来就自动启动mysqld服务
也就是:通过cron定时任务执行检测脚本

编写检测脚本 /root/bin/check

 代码如下 复制代码

#!/bin/bash
 
check=`pgrep mysql`
 
if [ -n "$check" ]; then
        exit
else
        date=$(date +"%Y-%m-%d %H:%M:%S")
        /etc/init.d/mysqld  start
        echo 'error: mysqld at ' $date
fi

明:也可以修改check=`pgrep mysql` 比如 check=`pgrep httpd` 或者 check=`pgrep nginx`来监测其他服务

编辑cron执行

crontab -e

cron内容如下,其中注释掉了一行,可选择性编写

#* * * * * sh /root/bin/check > /dev/null 2>&1 #执行后不发送结果邮件
* * * * * sh /root/bin/check >> /root/bin/log.txt #执行后发送结果到指定文件

由于cron每次执行后如果有输出则会默认发送邮件到 /var/spool/mail/root 长时间会导致 此文件有很多无用记录

我们可以用 > /dev/null 2>&1 忽略结果写入

当然也可以用 >> /root/bin/log.txt 写入到指定文件(要事先建立好文件)

符:

cron命令行简要说明
分 时 日 月 星期 命令行
例: */5 * * * * cmd #表示每5分钟执行一次命令

command > filename 把标准输出重定向到一个新文件中
command >> filename 把标准输出重定向到一个文件中(追加)
command 1 > fielname 把标准输出重定向到一个文件中
command > filename 2>&1 把标准输出和标准错误一起重定向到一个文件中
command 2 > filename 把标准错误重定向到一个文件中
command 2 >> filename 把标准输出重定向到一个文件中(追加)
command >> filename 2>&1 把标准输出和标准错误一起重定向到一个文件中(追加)
command < filename >filename2 把command命令以filename文件作为标准输入,以filename2文件作为标准输出
command < filename 把command命令以filename文件作为标准输入
command << delimiter 把从标准输入中读入,直至遇到delimiter分界符
command <&m 把文件描述符m作为标准输入
command >&m 把标准输出重定向到文件描述符m中
command <&- 把关闭标准输入
command 2>&1 把command命令标准错误重定向到标准输出

下面的shell通过一个while-do循环,用ps -ef|grep 检查loader进程是否正在运行,如果没有运行,则启动,这样就保证了崩溃挂掉的进程重新被及时启动。
必须注意两点:

1、ps |grep 一个进程时必须加上其路劲,否则容易grep到错误的结果;
2、必须用 -v 从结果中去除grep命令自身,否则结果非空。
 

 代码如下 复制代码
#!/bin/sh
#=====================
#YuanHui.HE
#khler@163.com
#=====================
while :
do
  echo "Current DIR is " $PWD
  stillRunning=$(ps -ef |grep "$PWD/loader" |grep -v "grep")
  if [ "$stillRunning" ] ; then
    echo "TWS service was already started by another way"
    echo "Kill it and then startup by this shell, other wise this shell will loop out this message annoyingly"
    kill -9 $pidof $PWD/loader
  else
    echo "TWS service was not started"
    echo "Starting service ..."
    $PWD/loader
    echo "TWS service was exited!"
  fi
  sleep 10
done

 
 如果启动此shell时发现进程已经存在,说明以别的方式启动了进程而不是此shell,那么它会持续提醒找到进程,解决办法是,要么只用此shell启动服务,要么一经发现以其他方式启动的服务即kill掉,上面的语句就是这么干的:
 
    kill -9 $pidof $PWD/loader

再补充一个监控nginx的shell脚本

Nginx 虽然处理并发量比 apache 确实要强点,但它这种 php-cgi 模式不是太稳定,这点网上也有朋友总结了,我在实现项目中也感受到了。

我们一台支付机,偶尔会出现以下情况的:php-cgi 进程突然消失了,造成PHP脚本无法访问;更不可思议的是明明是php-cgi 打开有两个端口在监听的,莫名其秒的突然有一个php-cgi 的端口被关闭了,造成所有请求全积在一个端口上,
结果造成PHP脚本访问异常。

基本这种情况,我写了个监控shell脚本的解决方案,不管以上出现那种情况,都自动恢复Nginx的服务.该脚本在生产环境上运行正常:

 代码如下 复制代码

#!/bin/bash
#
# filename: webservermonitor.sh
# 功能:监控 nginx 的 php-cgi 是否正常
# 作者:V哥
# 运行: webservermonitor.sh &
#

# php-cgi 监听的IP和端口
V_PHP_CGI_PORT="127.0.0.1:9000 127.0.0.1:9001"

# nginx重启的脚本
V_NGINX="/usr/local/nginx/sbin/restart.sh"

# 日志文件
V_LOG="/tmp/webservermonitor.log"

# 函数定义:重启nginx
function restart_nginx(){
    echo "----- `date` -----" >> $V_LOG
    echo "------------------" >> $V_LOG
    echo "`ps aux |grep 'nginx'`" >> $V_LOG
    echo "------------------" >> $V_LOG
    echo "`ps aux |grep 'php-cgi'`" >> $V_LOG
    echo "------------------" >> $V_LOG
    echo "`netstat -nlpt | grep 'php-cgi'`" >> $V_LOG
    echo "------------------" >> $V_LOG
    $V_NGINX  >> $V_LOG
}

# 循环执行,不采用 crontab ,国为 crontab 最小单位是分钟,时间太长了
while :
do

    # 1:先检测 nginx 主进程是否存在
    V_NGINX_NUM=`ps axu |grep 'nginx' |grep -v 'grep' |wc -l`
    if [ $V_NGINX_NUM -lt 1 ];then
        restart_nginx
        continue
    fi

    # 2:再检查php-cgi是否有进程存在
    V_PHP_CGI_NUM=`ps axu |grep 'php-cgi' |grep -v 'grep' |wc -l`
    if [ $V_PHP_CGI_NUM -lt 1 ];then
        restart_nginx
        continue
    fi

    # 3:再判断端口是否正常
    for PORT in $V_PHP_CGI_PORT
    do
        V_NUM=`eval "netstat -nlpt | grep '${PORT}' | wc -l"`
        if [ $V_NUM -lt 1 ];then
            restart_nginx
            continue
        fi
    done

    # 休眠
    sleep 5
done

ps:当然现在有一些服务器也提供方法像dnspod就提供了域名监控功能,可以监控到服务器是否正常哦。

时间: 2025-01-29 12:06:06

centos中shell定时检测mysqld,nginx,httpd服务脚本的相关文章

openssl-加密中的定时检测进行身份验证

问题描述 加密中的定时检测进行身份验证 openssl加密中有定时检测吗? 例如:程序运行10分钟,就进行一次身份认证? 还有别的什么加密有这种定时检测进行身份验证的吗? 急求答案? 解决方案 这个定时要你自己做,openssl只负责身份验证.

CentOS中crontab定时备份mysql数据库

1.编写备份数据库使用的shell脚本  代码如下 复制代码 vim /home/mysqlBack.sh #!/bin/bash MYSQL_USER=root MYSQL_PASS=root DATABASE=test FILE_NAME=$DATABASE.`date +%Y%m%d`.tar.gz TMP_FILENAME=$DATABASE.`date +%Y%m%d%H%M%S`.sql.gz #切换到文件存放的目录,防止在tar时,报警告信息:tar: Removing leadi

Centos中shell脚本切换用户执行命令

好了,这篇文章我只演示怎么用shell脚本切换到其他用户执行命令.   系统:centos 5.x 脚本内容: cat test.sh #!/bin/bash #author:http://blog.slogra.com su - test <<EOF pwd; exit; EOF 执行结果图: 当然也可以用下面的命令来执行 su - test -c "pwd" ps: 切换用户只执行一条命令的可以用: su - oracle -c command 切换用户执行一个shel

linux中shell批量添加用户和设置随机密码脚本

有一个朋友问我如何批量创建用户和设置密码 ,我就简单给他写了两个脚本,让他自己参考下并自己根据实际情况进行修改,毕竟他需要的用户名和密码都是实际生产环境的. 这里分两种情况,一种是测试for循环批量添加用户,一个是根据实际生产环境进行批量添加.分别写一下案例如下: 1,for添加指定类型用户以及设置随机密码. 脚本作用:批量添加user1-10用户并设置随机8位数随机密码 #!/bin/bash #test add user and set passwd for n in `seq 10` do

CentOS中Nginx+Apache+MySQL+PHP+Tomcat的配置教程(支持PHP、JAVA)

先来看CentOS6.4+Apache-2.2.22+Mysql-5.1.63+PHP-5.2.17+phpmyadmin-3.4.10.2+ZendDebug环境安装 LAMP安装手记(CentOS6.4+Apache-2.2.22+Mysql-5.1.63+PHP-5.2.17+phpmyadmin-3.4.10.2+ZendDebug)  代码如下 复制代码 rpm -e httpd rpm -e mysql rpm -e php yum -y remove httpd php mysql

redhat和centos中使用service控制启动与关闭

有时,我们自己安装了某个软件时,想让对这个服务更加容易的控制,在redhat/centos中我们会首先想到使用service xxx start|stop来进行实现,但可惜的是,这需要我们自己来编写启动关闭脚本,并且加入到启动列表中.如果你会点shell脚本的话,就会简单许多 以nginx来讲解一下它的过程,只是过程,就不粘贴shell脚本了 1.在/etc/init.d/目录下创建启动关闭脚本,如nginx 2.在编写脚本时,脚本中一定要有chkconfig参数,如: #chkconfig:

CentOS中利用yum配置lamp环境

1.安装Apache2 一条命令即可: yum -y install httpd 回车后,yum会提示当前已经安装的httpd版本,并自动更新:如果没有安装,则会自动安装.注意在yum 安装过程中输入"Y"以确认安装. Apache安装完成后,手动启动Apache2: /etc/init.d/httpd start 这时,直接在浏览器中输入服务器的IP地址,即可看到Apache2的默认页面.此时的Apache仅仅能提供 HTTP服务,不能执行php.也不能连接MySQL数据库. 2.安

CentOS中文件夹基本操作命令的讲解

  CentOS中文件夹基本操作命令的讲解 ls--显示指定目录下内容 说明:ls 显示结果以不同的颜色来区分文件类别.蓝色代表目录,灰色代表普通文件,绿色代表可执行文件,红色代表压缩文件,浅蓝色代表链接文件. -a---显示所有内容,包括隐藏文件 说明:在Linux系统中,以"."开头的就是隐藏文件或隐藏目录. -l---以长格式(内容更详细)显示文件或目录的详细信息. 说明:ls -l命令可以简写成ll, 输出的信息共分为7组: 文件类别和文件权限.链接数或子目录个数.文件所有者.

Linux CentOS下shell显示-bash-4.1$不显示用户名路径

  Linux CentOS下shell显示-bash-4.1$不显示用户名路径的解决方法 问题描述: CentOS下新增一个用户,登录进去之后shell脚本的信息如下: 而不是我们经常看到的username@hostname的组合,看起来很不舒服. 解决方案: 问题的原因是因为没有配置.bash_profile的问题,可以通过配置这个文件来解决问题. 1.在Terminal输入: [plain] vi ~/.bash_profile 2.如果没有.bash_profile可以自己添加.然后往文