• Shell脚本之linux服务器服务进程监控


    一、需求说明

      作为一名主机运维工程师,日常工作中我们每天都需要巡检服务器的运行情况,包括服务器的网络通断性、磁盘利用率、服务进程等内容。为了减少工作量我们可以通过编写shell脚本,实现服务器的批量巡检。写好脚本之后我们可以设置定时任务,将巡检结果邮件发送给自己就OK啦。为了检查服务进程是否存在,我们常用命令ps -ef |grep 关键字 过滤查看我们的进程是否存在。此脚本就是基于此命令的基础上实现的。

    二、脚本设计及内容

    1、设计思路说明

    • 通过ssh免密,使用ssh直接远程执行命令;Linux之SSH免密登录配置
    • 使用pgrep -f 关键字命令查看进程是否存在;
    • 使用$?判断进程号是否为空;
    • 将结果存储到检查日志记录文件;
    • 如果有进程不存在则邮件告知不存在信息,每天早上7点、晚上9点明确通知检查结果;Linux之mailx软件安装及使用
    • 清理超过30天的巡检记录。

    2、待巡检进程列表说明

      将待巡检进程信息写入processes.txt文件中,文件中包括4列信息,主机名,ssh端口号,进程服务关键字,进程服务描述说明。processes.txt各列的分隔符是空格,所以关键字中不能包含空格哦。
    在这里插入图片描述

    3、脚本内容

    #!/bin/bash
    #script name: process_check.sh
    #author: wuhs
    #description: 此脚本用于系统进程服务巡检
    
    #参数定义
    #巡检日志存储路径
    resultlog='/root/scripts/xunjian/process/recordlog'
    #待巡检进程列表
    processes="/root/scripts/xunjian/process/processes.txt"
    #进程巡检方法
    function process_monitor(){
    datedir=`date +%F-%H`
    mkdir -p $resultlog/$datedir
    #while循环按行读取进程列表
    while read line
    do
            #获取主机名、ssh端口号、service服务关键字
            host=`echo $line | awk '{print $1}'`
            port=`echo $line | awk '{print $2}'`
            service=`echo $line | awk '{print $3}'`
            #获取service服务的描述说明
            des=`echo $line | awk '{print $4}'`
            #查看进程是否存在
            ssh $host -p $port -n pgrep -f $service &>/dev/null
            #检查结果写入日志文件
            if [ $? -eq 0 ];then
                    echo "$host $des 正常" >> $resultlog/$datedir/success.log
            else
                    echo -e "$host $des 未启动" >> $resultlog/$datedir/faild.log
            fi      
    done <"$processes"
    
    #邮件通知检查结果
    if [ -s $resultlog/$datedir/faild.log ]; then
            mailx -s "进程巡检有进程不存在,请检查" 1234567qq@qq.com < $resultlog/$datedir/faild.log
    else
            hour=`date +%H`
            if [[ $hour == 07 || $hour == 21 ]]; then
                    mailx -s "进程巡检正常!" wuhsh@bigdatayh.com,524627027@qq.com < $resultlog/$datedir/success.log
            fi
    fi
    }
    #清理超过30天的进程巡检日志记录
    function log_clear(){
        cd $resultlog
        find -type d -mtime +30 |xargs rm -rf
    }
    
    function main(){
        #系统服务检查
        process_monitor
        log_clear
    }
    
    main
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    三、使用示例

    1、手动执行

    #mkdir -p /root/scripts/xunjian/process
    #创建工作目录,将脚本内容写入process_check.sh后保存,记得修改接受告警邮件的邮箱。
    #chmod u+x process_check.sh
    #脚本添加执行权限,将待巡检进程列表按照格式存入processes.txt文件中
    #sh process_check.sh
    #执行脚本,可以通过查看巡检日志文件获取巡检结果,也可以通过配置正确的邮箱,接受巡检结果。
    在这里插入图片描述

    2、配置定时任务

      我们可以配置定时任务,设置每小时或者每10分钟执行一次进程巡检,如下示例为每天的早上6点到晚上10点,每个小时执行一次。

    [root@s146 process]# crontab -l
    ####进程巡检定时任务####
    1 6-22 * * * /root/scripts/xunjian/process/process_check.sh &>> /tmp/s146-monitor.log

      配置完成定位任务后,我们就喝着茶,坐等巡检结果就好了。收到告警后及时处理。
    在这里插入图片描述

  • 相关阅读:
    一个Python中优雅的数据分块方法
    MySQL MHA高可用集群部署
    xxe攻击(XML外部实体)
    Java InputStream.markSupported()具有什么功能呢?
    基于Spring Boot 3 + Spring Security6 + JWT + Redis实现登录、token身份认证
    如何保持 SSH 会话不中断?
    1004 Counting Leaves
    Nginx高级技巧:实现负载均衡和反向代理
    css中关于fit-content尺寸的属性
    补坑简单图论题
  • 原文地址:https://blog.csdn.net/carefree2005/article/details/127552128