Linux下自动监控进程运行状态

news2024/9/23 3:30:15

目录

  • 背景
  • 应用举例
    • 1、使用crontab+脚本监控服务
    • 2、使用shell脚本监控服务
      • 2.1 编写自定义监控脚本
      • 2.2 运行脚本

背景

假设有一个服务需要长期运行,但可能会由于某种原因导致服务意外停止,不能及时发现,某天来到公司后发现出问题了才意识到服务挂了。此时再去手动重启服务可能已经造成很大损失了,那有没有办法可以自动监控服务运行状态,发现服务停止了自动拉起呢?如果你对Linux的定时任务crontab有所了解的话,很容易实现。如果还不了解crontab,请先阅读Linux定时任务之crontab一文。

应用举例

1、使用crontab+脚本监控服务

注意,crontab最小只支持分钟级的监控,如果需要秒级的监控频率,请参考方法2。
编写监控脚本:

#!/usr/bin/bash

log="/home/scripts/check.log"
pid=0
process_num=0
cpu_usage=0
mem_usage=0
# 要监控的服务名称
service_name="java"

# 日志文件不存在,就先创建
if [[ ! -e ${log} ]]; then
    touch ${log}
fi

function info()
{
    echo "[`date +'%F %T'` - INFO] - $1" >> ${log}
}

function warn()
{
    echo "[`date +'%F %T'` - WARN] - $1" >> ${log}
}

function error()
{
    echo "[`date +'%F %T'` - ERROR] - $1" >> ${log}
}

export -f info
export -f warn
export -f error

# 获取进程id
function proc_pid()
{
    pid=$(ps -ef | grep -v grep | grep ${service_name} | awk '{print $2}')
}

# 获取进程数量
function proc_num()
{
    process_num=$(ps -ef | grep -v grep | grep ${service_name} | wc -l)
}

# 获取cpu memory使用情况
function proc_cpu_mem_usage()
{
    process_info=$(top -bn1 -p ${pid} | tail -1)
    cpu_usage=$(echo ${process_info} | awk '{print $9}')
    mem_usage=$(echo ${process_info} | awk '{print $10}')
}


proc_num
if [[ ${process_num} -eq 0 ]]; then
    warn "${service_name} is not running!"
    # restart service
    # do something  ---  此处执行重启服务对应的命令,如  restart java (也可以是执行启动脚本,如sh xxx.sh start)
    proc_num
    proc_pid
    if [[ ${process_num} -eq 1 ]]; then
        info "${service_name} restart success(pid: ${pid})"
    fi
else
    proc_pid
    proc_cpu_mem_usage
    info "${service_name} is running(pid: ${pid} cpu_usage: ${cpu_usage} mem_usage: ${mem_usage})"
fi

添加监控脚本到定时任务中:
crontab -e打开编辑器,输入:
*/1 * * * * sh /home/scripts/check.sh,表示每分钟执行一次监控脚本。
查看输出的日志文件记录
在这里插入图片描述
这样就实现了每分钟监控一次进程的运行状态,如果服务停止则会自动拉起。

2、使用shell脚本监控服务

2.1 编写自定义监控脚本

如果想要实现秒级的监控频率,就需要自己写监控脚本了。下面是一个例子:

#!/usr/bin/bash

log="/home/scripts/check_1.log"
pid=0
process_num=0
cpu_usage=0
mem_usage=0
service_name="java"

if [[ ! -e ${log} ]]; then
    touch ${log}
fi

function info()
{
    echo "[`date +'%F %T'` - INFO] - $1" >> ${log}
}

function warn()
{
    echo "[`date +'%F %T'` - WARN] - $1" >> ${log}
}

function error()
{
    echo "[`date +'%F %T'` - ERROR] - $1" >> ${log}
}

export -f info
export -f warn
export -f error

function proc_pid()
{
    pid=$(ps -ef | grep -v grep | grep ${service_name} | awk '{print $2}')
}

function proc_num()
{
    process_num=$(ps -ef | grep -v grep | grep ${service_name} | wc -l)
}

function proc_cpu_mem_usage()
{
    process_info=$(top -bn1 -p ${pid} | tail -1)
    cpu_usage=$(echo ${process_info} | awk '{print $9}')
    mem_usage=$(echo ${process_info} | awk '{print $10}')
}



while true
do
    proc_num
    if [[ ${process_num} -eq 0 ]]; then
		warn "${service_name} is not running!"
		# restart service
		proc_num
		proc_pid
		if [[ ${process_num} -eq 1 ]]; then
			info "${service_name} restart success(pid: ${pid})"
		fi
    else
		proc_pid
		proc_cpu_mem_usage
		info "${service_name} is running(pid: ${pid} cpu_usage: ${cpu_usage} mem_usage: ${mem_usage})"
    fi
    # 此处的时间根据实际需要设置,单位为秒
    sleep 2
done

如果想要在脚本中添加对cpu、内存的使用情况监控,比如内存占用超过50%,cpu占用超过80%时告警,可以添加如下内容:

if [[ $(echo "${cpu_usage} > 80" | bc) -eq 1 ]]; then
    warn "CPU usage of ${service_name} is high(${cpu_usage}%)"
fi
if [[ $(echo "${mem_usage} > 50" | bc) -eq 1 ]]; then
    warn "Memory usage of ${service_name} is high(${mem_usage}%)"
fi

注意,此处比较大小用到了bc,这是因为bash本身只支持整数计算,不支持小数。在Linux系统中,bc是一款用于数学运算和数据处理的强大命令行工具,其名字代表"Basic Calculator"(基本计算器)。bc命令特别适用于处理浮点数和高精度数学运算,支持各种数学运算,如加减乘除、指数运算、取模、求平方根等。

2.2 运行脚本

1)直接运行:
执行sh /home/scripts/check.sh,直接运行脚本,如果终端窗口被关闭,进程会被kill。
2) 使用nohup放在后台不挂断地运行
nohup即使退出终端或关闭终端窗口,程序也会继续在后台运行。
nohup sh check1.sh 2>&1 &
在这里插入图片描述
关闭终端后,log中也能看到记录:
在这里插入图片描述
PS: 日志中的时间间隔可能不是严格的2s,这是因为执行命令也有时间损耗,积累到一定程度之后,就会出现和上一次的时间差大于2s。

此时如何关闭进程呢?使用ps查询进程即可:
ps -aux|grep check1.sh
在这里插入图片描述
查询到pid之后,使用kill -9 pid即可关闭进程
在这里插入图片描述
相比使用crontab创建的定时任务,脚本可以实现更小粒度的监控频率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1989991.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【linux】curl命令用法

curl命令认识 curl命令其实在平常工作中就已经在使用了,但是一直没有系统看过,就在这记录下,以后要用的话,可以在这儿查阅。 curl命令写的更清楚一点其实是cURL(client url,客户端URL或者command url命令…

时间复杂度计算方法以及常见题型

时间复杂度是衡量算法运行时间随输入规模增长而增长快慢的一种度量方式。它并不是指算法在特定硬件上的实际运行时间,而是算法在理想环境下执行时间的增长趋势。计算时间复杂度时,我们主要关注算法中执行次数最多的操作(即基本操作&#xff0…

算法板子:匈牙利算法——二分图的最大匹配

目录 1. 基础概念 (1)二分图的概念 (2) 匈牙利算法的作用 2. 代码 1. 基础概念 (1)二分图的概念 顶点集 V 分为两个集合,且图中每条边依附的两个顶点都分属于这两个子集,也就是第…

了解反向代理如何工作吗?

在当今数字化时代,网络通讯扮演着重要的角色,而代理技术为网络通讯提供了更多的灵活性和安全性。作为两种重要的代理技术,代理服务器和反向代理的运行原理和用途各有不同。本文将重点介绍反向代理的运行原理,深入探讨其在网络通讯…

运动耳机哪款好?多方位实测五大风靡网络的爆款,第一款竟然连奥运冠军都在用

随着健康意识的提升,将骨传导耳机作为运动伴侣的国人日益增多,其市场年度销售额已突破新高。然而,作为深耕运动装备领域多年的专家,我深感有责任告诫广大运动爱好者,在选择骨传导耳机时,务必保持警惕&#…

PD虚拟机共享文件夹 PD虚拟机共享蓝牙设备怎么设置 PD虚拟机如何共享文件

PD虚拟机(Parallels Desktop)是为有双系统使用需求人士设计的Mac系统软件。PD虚拟机可以在Mac电脑中设置Windows系统的应用软件。有了PD虚拟机的帮助,大家可以直接在Mac系统中使用其他如Windows的虚拟机系统,除此以外,…

软件RAID配置实战(2个案例场景)

文章目录 3、软件RAID管理-mdadm工具安装mdadm组件格式示例选项说明mdadm命令其它常用选项 4、相关查询命令查看创建RAID的进度查看RAID磁盘详细信息查看文件系统的磁盘空间使用情况 5、RAID配置示例场景1:RAID5步骤 场景2:RAID10步骤 6、移除RAID阵列 接…

031_java.util.concurrent.CopyOnWriteArrayList

继承体系 CopyOnWriteArrayList存在的目的是为了解决在高并发下list的读写。设计上希望只阻塞写行为,不会阻塞读行为。CopyOnWriteArrayList设计就基于此,在内部含有ReentrantLock用作修改时加锁,CopyOnWriteArrayList下有很多可以写方法&…

三种向量相似度计量方法——欧式距离、余弦相似度、皮尔逊相关系数

1、欧式距离 欧氏距离在机器学习可以清晰展示不同对象的相似程度。 欧式距离是最直观的距离度量方法之一,它衡量两个点之间的直线距离, 较小的欧式距离意味着较高的相似度。 分类——K近邻算法(KNN):需要对一个新的样本进行分类…

IIS6 PUT漏洞

一.漏洞描述 IIS Server 在 Web 服务扩展中开启了 WebDAV ,配置了可以写⼊的权限,造成任意⽂件上传 1.1环境搭建 环境 fofa:"IIS-6.0" 本地搭建2003 server 1.2漏洞复现 1.开启 WebDAV 和写权限: 1.3 漏洞复现 使…

随笔(三)——项目代码优化

文章目录 一、数据驱动的优化点0.项目技术1.需求说明2. 优化前3.优化后(复杂版)4.优化后(可读性高版) 二、使用循环遍历,减少if-else1.源代码2. 优化后3. 优点 一、数据驱动的优化点 0.项目技术 vue2 view design …

OpenAI 推出 gpt-4o-2024-08-06 模型 解析结构化输出功能 附体验平台

人工智能技术的边界再次被突破,OpenAI 社区迎来了 gpt-4o-2024-08-06 模型的问世,这不仅是一次技术的飞跃,更是对智能助手功能和可靠性的一次全面革新。 技术革新:gpt-4o-2024-08-06 模型的诞生 gpt-4o-2024-08-06 模型是 OpenA…

【深度学习】用Pytorch完成MNIST手写数字数据集的训练和测试

模型训练相关 思路: 导入数据集(对数据集转换为张量)加载数据集(使数据集成为可以进行迭代)搭建卷积模型进行模型训练(每训练一轮查看一次在测试集上的准确率)使用tensorboard进行可视化保存训…

MySQL3 DQL数据查询语言

DQL SQL-DQL重要地位简单查询selectjia简单查询数据准备别名(AS)消除重复行(DISTINCT去重)算数运算符0.优先级1.算数运算符2.比较运算符3.逻辑运算符4.位运算符 空值空值参与运算 条件查询普通条件查询特殊比较运算符BETWEEN...AND...INLIKEIS NULLleast,greatest运…

Unity补完计划 之 SpriteEditer SingleMode

本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正 因为unity不只是3d需要,还有2d游戏需要大量编辑处理图片素材,所以需要了解Sprite(精灵…

ASC格式的协议数据解析

函数来自RTT的AT组件 - at_client.c 例如,数据是 CGREG: 0,1,通过at_resp_parse_line_args_by_kw把1赋予link_stat。 简化从AT响应中提取信息的过程,使得编写与硬件通信的代码更加简洁和易于维护。 这么提数据也太方便了 at_resp_parse_l…

结构体练习作业

作业一:结构体数组存储学生信息(姓名,年龄,分数),完成输入学生信息,输出学生信息,求学生成绩之和,求最低学生成绩。 .h文件 main.c .c文件 输入信息 输出信息 平均值 最低值 作业二:在堆区,申…

STC-ISP升级MCU

STC-ISP升级mcu步骤: 1、RS232线连接电脑,芯片型号选择STC8H8K64U 2、波特率选择115200 3、IRC频率选择24MHz 4、设置EEPROM大小为64K 如下图设置: 插上RS232选择相应的COM口: 我这里的COM口是COM5. 打开程序文件&#xff1…

揭秘Redis的“隐藏武器”:跳跃表的原理与应用

1. 引言 1.1 Redis的快速崛起 Redis,全名为Remote Dictionary Server,是一个开源的高性能键值对存储系统,它提供了多种类型的数据结构,如字符串、列表、集合、有序集合等。由于其高性能、持久化选项以及丰富的特性,Re…

【已解决】如何获取到DF数据里最新的调薪时间,就是薪资最高且时间最早?

问题说明: 前几天在Python最强王者交流群【群除我佬】问了一个Pandas处理的问题,这里拿出来给大家分享下。 看上去不太好理解,其实说白了,就是在工资最高里,再找时间最早的。 换句话说就是,这三个人&…