学习
实践
活动
工具
TVP
写文章
专栏首页蓝天通用的进程监控重拉起bash脚本process_monitor.sh

通用的进程监控重拉起bash脚本process_monitor.sh

process_monitor.zip


 #!/bin/sh
 # https://github.com/eyjian/mooon/blob/master/common_library/shell/process_monitor.sh
 #
 # 运行日志:/tmp/process_monitor.log,由于多进程同时写,不一定完整,仅供参考。
 # 请放到crontab中运行,如(注意要以后台方式运行,因为脚本是常驻不退出的):
 # * * * * * /usr/local/bin/process_monitor.sh /usr/sbin/rinetd /usr/sbin/rinetd > /dev/null 2>&1 &
 #
 # 进程监控脚本,当指定进程不存在时,执行重启脚本将它拉起
 # 特色:
 # 1.本监控脚本可重复执行,它会自动做互斥
 # 2.互斥不仅依据监控脚本文件名,而且包含了它的命令行参数,只有整体相同时互斥才生效
 # 3.对于被监控的进程,可以只指定进程名,也可以包含命令行参数
 # 4.不管是监控脚本还是被监控进程,总是只针对属于当前用户下的进程
 #
 # 如果本脚本手工运行正常,但在crontab中运行不正常,则可考虑检查下ps等命令是否可在crontab中正常运行
 
 
 # 实际中,遇到脚本在crontab中运行时,找不到ls和ps等命令
 # 原来是有些环境ls和ps位于/usr/bin目录下,而不是常规的/bin目录
 export PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin:$PATH
 
 
 # 需要指定个数的命令行参数
 # 参数1:被监控的进程名(可以包含命令行参数)
 # 参数2:重启被监控进程的脚本
 if test $# -ne 2; then
     printf "\033[1;33musage: $0 process_cmdline restart_script\033[m\n"
     printf "\033[1;33mexample: /usr/local/bin/process_monitor.sh \"/usr/sbin/rinetd\" \"/usr/sbin/rinetd\"\033[m\n"
     printf "\033[1;33mplease install process_monitor.sh into crontab by \"* * * * *\"\033[m\n"
     exit 1
 fi
 
 
 process_cmdline="$1" # 需要监控的进程名,或完整的命令行,也可以为部分命令行
 restart_script="$2"  # 用来重启进程的脚本,要求具有可执行权限
 monitor_interval=2   # 定时检测时间间隔,单位为秒
 start_seconds=5      # 被监控进程启动需要花费多少秒
 cur_user=`whoami`    # 执行本监控脚本的用户名
 
 
 # 取指定网卡上的IP地址
 #eth=1&&netstat -ie|awk -F'[: ]' 'begin{found=0;} { if (match($0,"eth'"$eth"'")) found=1; else if ((1==found) && match($0,"eth")) found=0; if ((1==found) && match($0,"inet addr:") && match($0,"Bcast:")) print $13; }'
 
 
 # 下面这段脚本,用来阻止多个监控脚本进程出现
 uid=`id -u $cur_user`
 self_name=`basename $0`
 self_cmdline="$0 $*"
 process_name=$(basename `echo "$process_cmdline"|cut -d" " -f1`)
 process_match="${process_cmdline#* }" # 只保留用来匹配的参数部分
 process_match=$(echo $process_match) # 去掉前后的空格
 
 
 # 用来做互斥,
 # 以保证只有最先启动的能运行,
 # 但若不同参数的彼此不相互影响,
 # 这样保证了可同时对不同对象进行监控。
 active=0
 
 
 # 日志文件,可能多个用户都在运行,
 # 所以日志文件名需要加上用户名,否则其它用户可能无权限写
 log_filepath=/tmp/process_monitor-$cur_user.log
 # 日志文件大小(10M)
 log_filesize=10485760
 
 
 # 写日志函数,带1个参数:
 # 1) 需要写入的日志
 log()
 {
     # 创建日志文件,如果不存在的话    
     if test ! -f $log_filepath; then
         touch $log_filepath
     fi
 
 
     record=$1
     # 得到日志文件大小
     file_size=`ls --time-style=long-iso -l $log_filepath 2>/dev/null|cut -d" " -f5`
 
 
     # 处理日志文件过大
     # 日志加上头[$process_cmdline],用来区分对不同对象的监控
     if test ! -z $file_size; then        
         if test $file_size -lt $log_filesize; then
             printf "[$process_cmdline]$record"
             printf "[$process_cmdline]$record" >> $log_filepath
         else
             printf "[$process_cmdline]$record" >> $log_filepath
             mv $log_filepath $log_filepath.bak # 备份
 
 
             printf "[$process_cmdline][`date +'%Y-%m-%d %H:%M:%S'`]truncated\n"
             printf "[$process_cmdline][`date +'%Y-%m-%d %H:%M:%S'`]truncated\n" > $log_filepath
 
 
             printf "[$process_cmdline]$record"
             printf "[$process_cmdline]$record" >> $log_filepath            
         fi
     fi
 }
 
 
 # 以死循环方式,定时检测指定的进程是否存在
 # 一个重要原因是crontab最高频率为1分钟,不满足秒级的监控要求
 while true; do
     self_count=`ps -C $self_name h -o euser,args| awk 'BEGIN { num=0; } { if (($1==uid || $1==cur_user) && match($0, self_cmdline)) {++num;}} END { printf("%d",num); }' uid=$uid cur_user=$cur_user self_cmdline="$self_cmdline"`
     if test $self_count -gt 2; then 
         log "\033[0;32;31m[`date +'%Y-%m-%d %H:%M:%S'`]$0 is running[$self_count/active:$active], current user is $cur_user.\033[m\n"
         # 经测试,正常情况下一般为2,
         # 但运行一段时间后,会出现值为3,因此放在crontab中非常必要
         # 如果监控脚本已经运行,则退出不重复运行
         if test $active -eq 0; then
             exit 1
         fi
     fi
 
 
     # 检查被监控的进程是否存在,如果不存在则重启
     if test -z $process_match; then
         process_count=`ps -C $process_name h -o euser,args| awk 'BEGIN { num=0; } { if (($1==uid || $1==cur_user)) {++num;}} END { printf("%d",num); }' uid=$uid cur_user=$cur_user`
     else
         process_count=`ps -C $process_name h -o euser,args| awk 'BEGIN { num=0; } { if (($1==uid || $1==cur_user) && match($0, process_match)) {++num;}} END { printf("%d",num); }' uid=$uid cur_user=$cur_user process_match="$process_match"`
     fi
     if test $process_count -lt 1; then
         # 执行重启脚本,要求这个脚本能够将指定的进程拉起来
         log "\033[0;32;34m[`date +'%Y-%m-%d %H:%M:%S'`]restart \"$process_cmdline\"\033[m\n"
         sh -c "$restart_script" >> $log_filepath 2>&1 # 注意一定要以“sh -c”方式执行
     fi
 
 
     active=1
     # sleep时间得长一点,原因是启动可能没那么快,以防止启动多个进程
     sleep $start_seconds
 done
 exit 0
 
本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!
本文分享自作者个人站点/博客:http://blog.chinaunix.net/uid/20682147.html复制
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • 通用的进程监控脚本process_monitor.sh使用方法

    通过需要将process_monitor.sh放到crontab上,以便系统重启自动生效,也可避免process_monitor.sh被意外终止导致失效,cro...

    一见
  • 通用的停止进程bash脚本

    printf "\033[1;33musage: $0 process_cmdline\033[m\n"

    一见
  • 使用process_monitor.sh监控hadoop进程的crontab配置

    可以从下列链接找到process_monitor.sh: https://github.com/eyjian/mooon/blob/master/commo...

    一见
  • Kafka常用命令收录

    本文内容主要来自两个方面:一是网上的分享,二是自研的随手记。日记月累,收录kafka各种命令,会持续更新。

    一见
  • shell脚本监控&自动拉起程序

    自己在服务器跑一些需要长期运行的程序时,偶尔会因为一些奇怪的原因挂掉,如果要人为去检查很麻烦,因此最好能够实现自动的检测和挂掉拉起。

    Cloudox
  • Linux后台开发常用工具

    本文是个大杂烩,内容为日常点滴的日积月累,持续更新当中,可关注博客(https://blog.csdn.net/Aquester或http://aqueste...

    一见
  • ansible生产环境使用场景(二)

    ​ 生产上新入网的服务器都需要安装prometheus的监控客户端软件,主要步骤有:新建监控用户、拷贝客户端软件、拉起客户端进程、开机自启动。本文记录了使...

    loong576
  • 漫谈容器监控系统

    当容器运行在物理机上的时候,一般的监控的agent是直接运行在物理机上,在进行容器的健康检查的时候,依赖于docker客户端程序。

    SRE运维实践
  • 如何在一个Docker中同时运行多个程序进程?

    那么基本思路是在Dockerfile 的CMD 或者 ENTRYPOINT 运行一个”东西”,然后再让这个”东西”运行多个其他进程 简单说来是用Bash She...

    sunsky
  • 分享一次Linux任务计划crontab不执行的问题排查过程

    朋友弄了一个小项目,要我帮忙做下 Linux 系统运维,上线一段时间后,发现项目偶尔会挂掉导致服务不可用。开发朋友一时之间也没空去研究项目奔溃的根因,只好由我这...

    张戈
  • Linux服务器感染kerberods病毒 | 挖矿病毒查杀及分析

    1、CPU使用率异常,top命令显示CPU统计数数据均为0,利用busybox 查看CPU占用率之后,发现CPU被大量占用。

    追马
  • 基于“树莓派+腾讯云”的在线甲醛监测系统

    导语 扔掉小瓶盖,腾讯云带你体验在线甲醛监测系统!本文详述腾讯云多产品组合设计和体验报告 之 “树莓派+腾讯云=在线甲醛监测系统”。涉及腾讯云产品:API网关、...

    腾讯技术工程官方号
  • 基于“树莓派+腾讯云”的在线甲醛监测系统

    身边朋友在装修新房,顺便来吐槽甲醛检测麻烦,比如 有检测无监测(一次性),比如测试复杂(现场+人工)等等。刚好做为云产品经理,经常想的就是如何了解和验证多云产品...

    代码医生工作室
  • systemd - CentOS 7进程守护&监控

    运行环境为CentOS 7系统,我们开发了一个程序,需要在开机时启动它,当程序进程crash或者开机之后,守护进程立即拉起进程。

    sunsky
  • 高性能高可用的分布式唯一ID服务——mooon-uniq-id

    源码位置:https://github.com/eyjian/mooon/tree/master/application/uniq_id。

    一见
  • 从挖矿木马看后渗透维权

    由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。 雷神众测拥有对此文章的修改和...

    安恒网络空间安全讲武堂
  • 虚拟化及云计算硬核技术内幕 (33) —— 你说的这个朋友是不是你自己

    上回说到,方老师有一个朋友,写招聘JD不小心把“售前产品经理”打错成“收钱产潘金莲”,而且发出去了。

    用户8289326
  • 23-Keepalived配置Nginx自动重启,实现7X24小时不间断服务

    现在主备是正常的, Keepalived服务关闭会自动切换到backup, 那么要是Nginx挂了呢

    彼岸舞
  • 注意了!这样用 systemd 可能会有风险

    在 Linux 6 / CentOS 6 中,使用 service 来进行服务的起停,但是在 Linux 7 / CentOS 7 中,替换为使用 system...

    大江小浪

扫码关注腾讯云开发者

领取腾讯云代金券