zoukankan      html  css  js  c++  java
  • linux环境进程开机自检脚本

    Linux下shell脚本监控Tomcat的状态并实现自动启动

    最近公司需要在Linux下监控tomcat的服务,一旦tomcat服务存在异常或者宕机,重启tomcat保证服务的正常运行,由于Linux下有Shell脚本可以实现此效果,就没有考虑用Java代码写了,下面是Linux下shell脚本监控Tomcat的状态并实现自动启动的步骤。

    1编写Shell脚本monitor.sh: 
    此脚本代码参考于张小凡vip的博客https://blog.csdn.net/zzq900503/article/details/50723191

    #!/bin/sh

    # func:自动监控tomcat脚本并且执行重启操作
    # author:EagleHao
    # date:2018-04-08
    # DEFINE

    # 获取tomcat进程ID(其中[grep -w 'tomcat']代码中的tomcat需要替换为你的tomcat文件夹名)
    TomcatID=$(ps -ef |grep tomcat |grep -w 'tomcat'|grep -v 'grep'|awk '{print $2}')

    # tomcat启动程序(这里注意tomcat实际安装的路径)
    StartTomcat=/usr/local/tomcat/bin/startup.sh
    TomcatCache=/usr/local/tomcat/work

    #定义要监控的页面地址
    WebUrl=http://localhost:8080

    #日志输出
    GetPageInfo=/tmp/TomcatMonitor.Info
    TomcatMonitorLog=/tmp/TomcatMonitor.log

    Monitor()
    {
    echo "[info]开始监控tomcat...[$(date +'%F %H:%M:%S')]"
    if [ $TomcatID ];then #这里判断Tomcat进程是否存在
    echo "[info]当前tomcat进程ID为:$TomcatID,继续检测页面..."
    # 检测是否启动成功(成功的话页面会返回状态"200")
    TomcatServiceCode=$(curl -s -o $GetPageInfo -m 10 --connect-timeout 10 $WebUrl -w %{http_code})
    if [ $TomcatServiceCode -eq 200 ];then
    echo "[info]页面返回码为$TomcatServiceCode,tomcat启动成功,测试页面正常"
    else
    echo "[error]tomcat页面出错,请注意...状态码为$TomcatServiceCode,错误日志已输出到$GetPageInfo"
    echo "[error]页面访问出错,开始重启tomcat"
    kill -9 $TomcatID # 杀掉原tomcat进程
    sleep 3
    rm -rf $TomcatCache # 清理tomcat缓存
    $StartTomcat
    fi
    else
    echo "[error]tomcat进程不存在!tomcat开始自动重启..."
    echo "[info]$StartTomcat,请稍候..."
    rm -rf $TomcatCache
    $StartTomcat
    fi
    echo "--------------------------"
    }
    Monitor>>$TomcatMonitorLog

    #######

    在写脚本的时候遇到了一个小问题,就是编写的过程中粗心,导致if的[]少了两个空格,如下:
    错误格式:if [$TomcatID]
    正确格式:if [ $TomcatID ]
    如果少了这两个空格,脚本执行是会报错的。

    编写完脚本后,先执行以下脚本:

    ./monitor.sh
    1
    如果报权限错误,需要给脚本授权

    chmod 777 monitor.sh
    1
    脚本执行成功后,可以去/tmp目录下面查看日志文件TomcatMonitor.log,如果脚本测试没有问题,我们开始给此脚本设置一个定时任务。
    先查看系统是否安装了crontab

    如果没有安装,则先安装

    安装crontab:

    yum install crontabs

    服务操作说明:

    /sbin/service crond start[这里写链接内容](https://blog.csdn.net/zzq900503) //启动服务

    /sbin/service crond stop //关闭服务

    /sbin/service crond restart //重启服务

    /sbin/service crond reload //重新载入配置

    /sbin/service crond status //启动服务

    安装完成后启动crontab服务,如果有如下提示(Centos7以上版本),则按照提示启动服务即可


    crontab服务启动没问题后,运行crontab –e 编写一条定时任务 * * * * * /usr/local/monitor.sh 在每1分钟执行一次monitor.sh脚本。

    然后重新启动crontab服务,这时再去/tmp下面查看日志文件TomcatMonitor.log,测试结果。

    接下来将crontab设为开机启动chkconfig --level 35 crond on,如果有如下提示(Centos7以上版本),则按照提示设置即可


    至此整个监控tomcat服务的脚本已经完成,以下是代码解析:

    ps -e //显示所有进程

    ps -f //按树状显示

    grep tomcat //只取含有tomcat的行

    grep -w 'apache-tomcat-5.5.23' //-w选项搜索一个单词,并且避免搜索到词中的部分字串。 搜索含有apache-tomcat-5.5.23的行

    grep -v 'grep' //去掉含有grep的行

    awk '{print $2}' //用空格切分 取第二列

    ps -ef |grep tomcat |grep -w 'apache-tomcat-5.5.23'|grep -v 'grep'|awk '{print $2}' //获取tomcat的进程id

    但是仅仅是 tomcat进程存在是不够的,需要访问下 站点页面看看 是否访问正常 正常状态为200 通过curl

    curl -s -o $GetPageInfo -m 10 --connect-timeout 10 $WebUrl -w %{http_code} //访问页面并保存页面内容返回状态码
    -s --silent //静默模式,就是不显示错误和进度
    -o $GetPageInfo //将文件保存到本地并命名为$GetPageInfo
    -m //表示获取网页的最长时间(数据传输的最大允许时间)
    -m 10 //表示如果10秒内无法完成获取网页源码的操作,则放弃
    --connect-timeout //连接超时时间
    --connect-timeout 10 //表示如果10秒内无法连接,则放弃
    $WebUrl //就是我们要访问的页面路径变量
    -w //curl的-w参数我们可以自定义curl的输出,%{http_code}代表http状态码

    如果状态码为200则 tomcat正常,否则 kill 杀掉tomcat 进程, 访问tomcat的启动脚本 start.sh 启动tomcat

    再是crontab解析

    crontab –e //编写一条定时任务
    crontab -l //列出当前用户定时任务
    crontab -r //删除当前用户定时任务

    crontab文件格式:

    * * * * * command

    minute hour day month week command

    分 时 天 月 星期 命令
    minute: 表示分钟,可以是从0到59之间的任何整数。

    hour:表示小时,可以是从0到23之间的任何整数。

    day:表示日期,可以是从1到31之间的任何整数。

    month:表示月份,可以是从1到12之间的任何整数。

    week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。

    command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

    星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。

    逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”。

    中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”。

    正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。

    参考资料:
    https://blog.csdn.net/zzq900503/article/details/50723191
    https://www.cnblogs.com/zoulongbin/p/6187238.html
    https://blog.csdn.net/weixin_41004350/article/details/78492367?locationNum=10&fps=1
    ---------------------

    https://jsczxy2.iteye.com/blog/2170658

    检测tomcat假死时重新启动及邮件通知

    检测逻辑:连续3次访问tomcat提供的接口,若3次响应码都不为200,则自动重启tomcat
    脚本内容:

    #!/bin/bash
    source /etc/profile
    IP=10.78.1.183
    PORT=8114
    TOMCAT_DIR=/soft/tomcat_8114
    #定义发送邮件函数
    function send_mail(){
        maillist=(
            zhengwei.liu@xxx.cn
        )
        DATE=`date +'%F %T'`
        SUBJECT="${IP}的${PORT}端口发生故障,已自动重启!"
        CONTENT="时间:${DATE}
    主机:${IP}
    事件:${PORT}端口发生重启"
            for mail in ${maillist[*]};do
                echo -e "${CONTENT}" | mail -s "${SUBJECT}" $mail
            done
    }
    #对接口访问3次
    declare -i NUM=0
    for i in `seq 1 3`;do
        CODE=$(/usr/bin/curl -I -m 10 -o /dev/null -s -w %{http_code}"
    " http://${IP}:${PORT})
        if [ $CODE == "000"  ];then
            ((NUM++))   
        fi
        sleep 3
    done
    #根据NUM的值来确定是否重启tomcat,NUM=3时进行重启
    if [ $NUM == 3 ];then
            IS_LIVING=`jps -m -l -v | grep "${PORT}" | wc -l`
            if [ ${IS_LIVING} -eq 1 ];then
                    PID=`jps -m -l -v | grep "${PORT}" | awk '{print $1}'`
                    kill -9 $PID
                    ${TOMCAT_DIR}/bin/startup.sh
            elif [ ${IS_LIVING} -eq 0 ];then
            ${TOMCAT_DIR}/bin/startup.sh
            fi
           send_mail
    fi

    任务计划:每5分钟检测一次

    */5 * * * * /server/scripts/tomcat/check_8114.sh &> /dev/null
  • 相关阅读:
    WPF DelegateCommand 出现Specified cast is not valid
    WPF DelegateCommand 出现Specified cast is not valid
    WPF DelegateCommand 出现Specified cast is not valid
    win10 sdk 是否向下兼容
    win10 sdk 是否向下兼容
    win10 sdk 是否向下兼容
    PHP extract() 函数
    PHP end() 函数
    PHP each() 函数
    PHP current() 函数
  • 原文地址:https://www.cnblogs.com/zgq123456/p/10966810.html
Copyright © 2011-2022 走看看