Shell - 监控某个进程的内存占用情况、主机CPU、磁盘空间等信息以及守护进程

本文涉及的产品
Elasticsearch Serverless通用抵扣包,测试体验金 200元
简介: Shell - 监控某个进程的内存占用情况、主机CPU、磁盘空间等信息以及守护进程

20200928103236959.png


脚本

 #!/bin/sh
##############################
## 名称: MonitorES.sh
## 描述: 主机利用率超过阈值  判断top占用内存的进程 匹配ES 重启
## 参数: 暂无
## 作者: 小工匠
##############################
#定义退出标识符
EXIT_FAILURE=1   #Failing exit status 
EXIT_SUCCESS=0   #Successful exit status   
THREOD=$1
#当天
CURRENT_DAY=`date "+%Y%m%d"`
#当前执行脚本的全路径
SCRIPT_PATH=$(cd `dirname $0`; pwd)
LOG_FILE=$SCRIPT_PATH/MonitorES_$CURRENT_DAY.log 
#进程名称
PROCESS='org.elasticsearch.bootstrap.Elasticsearch'
#进程PID
PID=$(ps -ef| grep $PROCESS | grep -v 'grep' | awk '{print $2;}')
#记录Memory、Storage、CPU 信息
RecordCurrentUsage(){
  /usr/bin/free -m >>$LOG_FILE 2>&1
  free -m | awk 'NR==2{printf "Memory Usage: %s/%sMB (%.2f%%)\n", $3,$2,$3*100/$2 }' >>$LOG_FILE 2>&1
  df -h | awk '$NF=="/"{printf "Disk Usage: %d/%dGB (%s)\n", $3,$2,$5}' >>$LOG_FILE 2>&1
  top -bn1 | grep load | awk '{printf "CPU Load: %.2f\n", $(NF-2)}' >>$LOG_FILE 2>&1
}
#当前主机内存使用率   used/total 
CalcCurrentMemoryRatio(){
  MemoryRatio=$(/usr/bin/free | awk '/Mem/{printf("RAM Usage: %.0f\n"), $3/$2*100}' |  awk '{print $3}')
  echo "当前主机内存使用率:$MemoryRatio% " >>$LOG_FILE 2>&1
}
#执行
ExecStrategy(){
  # ES实际使用内存
  MemorySizeOfES=$(awk '/VmRSS/ {print $2}' < /proc/$PID/status) 
  echo "ES实际使用内存:$MemorySizeOfES " >>$LOG_FILE 2>&1
  # 主机总内存
  MemorySizeOfServer=$(free | sed -n '2p' | awk '{print $2}')
  echo "主机总内存:$MemorySizeOfServer " >>$LOG_FILE 2>&1
        EsMemoryRatio=$(printf "%d%%" $(($MemorySizeOfES*100/$MemorySizeOfServer)))
  echo "ES内存/总内存:$MemorySizeOfES/$MemorySizeOfServer=$EsMemoryRatio " >>$LOG_FILE 2>&1
  if [ "$MemorySizeOfES" = "" ]; then
          MemorySizeOfES=0
        fi
  if [ "$MemorySizeOfServer" = "" ]; then
         MemorySizeOfServer=0
        fi
  if [ $MemoryRatio -ge $THREOD ]; then 
       # do something  TODO
           echo "当前主机内存使用$MemoryRatio 大于阈值 $THREOD, Do Action"   >>$LOG_FILE 2>&1 
        else 
           echo "当前主机内存使用$MemoryRatio 小于阈值 $THREOD, Do Nothing"   >>$LOG_FILE 2>&1
  fi
}
echo "==========================begin  `date "+%Y-%m-%d %H:%M:%S"`===============================================" >>$LOG_FILE 2>&1
if [ -z ${PID} ];then
  echo "The $PROCESS does not exist." >>$LOG_FILE 2>&1
  exit EXIT_FAILURE
fi 
RecordCurrentUsage
CalcCurrentMemoryRatio
ExecStrategy
echo "==========================end    `date "+%Y-%m-%d %H:%M:%S"`=================================================" >>$LOG_FILE 2>&1
#输出一行空行到日志中,方便区分每次执行的日志
echo "" >>$LOG_FILE 2>&1
exit $EXIT_SUCCESS


启动的两种方式

方式一 注册到系统Cron

registMonitor(){
  echo "*/5 * * * * sh ${current_path}/MonitorES.sh 95" >  /var/spool/cron/root
}


这种方式有个缺点,没法停止服务,除非把cron也注释掉。。。


方式二

while循环 比如这个守护

#!/bin/bash
logfile=/watch.log
touch $logfile
while [ 1 -eq 1 ]
do
        AdminProcNum=`ps -ef | grep "org.elasticsearch.bootstrap.Elasticsearch" | grep -v grep | wc -l`
  echo "---------------------------  $(date "+%Y-%m-%d %H:%M:%S") ElasticsearchProcNum: $AdminProcNum  -----------------------------------------" >> ${logfile}  2>&1 
        if [ $AdminProcNum -lt 1 ]
        then
    echo "start" >> /xxx.log 
    su elasticsearch<<!
    cd $ES_HOME
    ./bin/elasticsearch -d
    exit
!
    echo "--------------------------- Elasticsearch Started By Watcher  $(date "+%Y-%m-%d %H:%M:%S")----------------------------------------" >> ${logfile}  2>&1 
        fi
        sleep 60
done



运行结果

一天一个文件 ,注意清理

==========================begin  2020-09-28 08:20:01===============================================
              total        used        free      shared  buff/cache   available
Mem:           3940        2652         635           6         653        1047
Swap:          2047         829        1218
Memory Usage: 2652/3940MB (67.31%)
Disk Usage: 16/18GB (96%)
CPU Load: 0.38
CPU Load: 0.10
当前主机内存使用率:67% 
ES实际使用内存:1302560 
主机总内存:4035036 
ES内存/总内存:1302560/4035036=32% 
当前主机内存使用67 小于阈值 95, Do Nothing
==========================end    2020-09-28 08:20:01=================================================
==========================begin  2020-09-28 08:25:01===============================================
              total        used        free      shared  buff/cache   available
Mem:           3940        2651         634           6         653        1047
Swap:          2047         829        1218
Memory Usage: 2651/3940MB (67.28%)
Disk Usage: 16/18GB (96%)
CPU Load: 0.56
CPU Load: 0.10
当前主机内存使用率:67% 
ES实际使用内存:1302568 
主机总内存:4035036 
ES内存/总内存:1302568/4035036=32% 
当前主机内存使用67 小于阈值 95, Do Nothing
==========================end    2020-09-28 08:25:01=================================================



20210707225745171.gif


linux内存、cpu、磁盘IO

#!/bin/bash
# 获取要监控的本地服务器IP地址
IP=`ifconfig | grep inet | grep -vE 'inet6|127.0.0.1' | awk '{print $2}'`
echo "IP地址:"$IP
# 获取cpu总核数
cpu_num=`grep -c "model name" /proc/cpuinfo`
echo "cpu总核数:"$cpu_num
# 1、获取CPU利用率
# 获取用户空间占用CPU百分比
cpu_user=`top -b -n 1 | grep Cpu | awk '{print $2}' | cut -f 1 -d "%"`
echo "用户空间占用CPU百分比:"$cpu_user
# 获取内核空间占用CPU百分比
cpu_system=`top -b -n 1 | grep Cpu | awk '{print $4}' | cut -f 1 -d "%"`
echo "内核空间占用CPU百分比:"$cpu_system
# 获取空闲CPU百分比
cpu_idle=`top -b -n 1 | grep Cpu | awk '{print $8}' | cut -f 1 -d "%"`
echo "空闲CPU百分比:"$cpu_idle
# 获取等待输入输出占CPU百分比
cpu_iowait=`top -b -n 1 | grep Cpu | awk '{print $10}' | cut -f 1 -d "%"`
echo "等待输入输出占CPU百分比:"$cpu_iowait
#2、获取CPU上下文切换和中断次数
# 获取CPU中断次数
cpu_interrupt=`vmstat -n 1 1 | sed -n 3p | awk '{print $11}'`
echo "CPU中断次数:"$cpu_interrupt
# 获取CPU上下文切换次数
cpu_context_switch=`vmstat -n 1 1 | sed -n 3p | awk '{print $12}'`
echo "CPU上下文切换次数:"$cpu_context_switch
#3、获取CPU负载信息
# 获取CPU15分钟前到现在的负载平均值
cpu_load_15min=`uptime | awk '{print $11}' | cut -f 1 -d ','`
echo "CPU 15分钟前到现在的负载平均值:"$cpu_load_15min
# 获取CPU5分钟前到现在的负载平均值
cpu_load_5min=`uptime | awk '{print $10}' | cut -f 1 -d ','`
echo "CPU 5分钟前到现在的负载平均值:"$cpu_load_5min
# 获取CPU1分钟前到现在的负载平均值
cpu_load_1min=`uptime | awk '{print $9}' | cut -f 1 -d ','`
echo "CPU 1分钟前到现在的负载平均值:"$cpu_load_1min
# 获取任务队列(就绪状态等待的进程数)
cpu_task_length=`vmstat -n 1 1 | sed -n 3p | awk '{print $1}'`
echo "CPU任务队列长度:"$cpu_task_length
#4、获取内存信息
# 获取物理内存总量
mem_total=`free | grep Mem | awk '{print $2}'`
echo "物理内存总量:"$mem_total
# 获取操作系统已使用内存总量
mem_sys_used=`free | grep Mem | awk '{print $3}'`
echo "已使用内存总量(操作系统):"$mem_sys_used
# 获取操作系统未使用内存总量
mem_sys_free=`free | grep Mem | awk '{print $4}'`
echo "剩余内存总量(操作系统):"$mem_sys_free
# 获取应用程序已使用的内存总量
mem_user_used=`free | sed -n 3p | awk '{print $3}'`
echo "已使用内存总量(应用程序):"$mem_user_used
# 获取应用程序未使用内存总量
mem_user_free=`free | sed -n 3p | awk '{print $4}'`
echo "剩余内存总量(应用程序):"$mem_user_free
# 获取交换分区总大小
mem_swap_total=`free | grep Swap | awk '{print $2}'`
echo "交换分区总大小:"$mem_swap_total
# 获取已使用交换分区大小
mem_swap_used=`free | grep Swap | awk '{print $3}'`
echo "已使用交换分区大小:"$mem_swap_used
# 获取剩余交换分区大小
mem_swap_free=`free | grep Swap | awk '{print $4}'`
echo "剩余交换分区大小:"$mem_swap_free
#5、获取磁盘I/O统计信息
echo "指定设备(/dev/sda)的统计信息"
# 每秒向设备发起的读请求次数
disk_sda_rs=`iostat -kx | grep sda| awk '{print $4}'`
echo "每秒向设备发起的读请求次数:"$disk_sda_rs
# 每秒向设备发起的写请求次数
disk_sda_ws=`iostat -kx | grep sda| awk '{print $5}'`
echo "每秒向设备发起的写请求次数:"$disk_sda_ws
# 向设备发起的I/O请求队列长度平均值
disk_sda_avgqu_sz=`iostat -kx | grep sda| awk '{print $9}'`
echo "向设备发起的I/O请求队列长度平均值"$disk_sda_avgqu_sz
# 每次向设备发起的I/O请求平均时间
disk_sda_await=`iostat -kx | grep sda| awk '{print $10}'`
echo "每次向设备发起的I/O请求平均时间:"$disk_sda_await
# 向设备发起的I/O服务时间均值
disk_sda_svctm=`iostat -kx | grep sda| awk '{print $11}'`
echo "向设备发起的I/O服务时间均值:"$disk_sda_svctm
# 向设备发起I/O请求的CPU时间百分占比
disk_sda_util=`iostat -kx | grep sda| awk '{print $12}'`
echo "向设备发起I/O请求的CPU时间百分占比:"$disk_sda_util



详解


相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。 &nbsp;
相关文章
|
3月前
|
缓存 人工智能 算法
不同业务怎么选服务器?CPU / 内存 / 带宽配置表
本文详解了服务器三大核心配置——CPU、内存、带宽,帮助读者快速理解服务器性能原理。结合不同业务场景,如个人博客、电商、数据库、直播等,提供配置选择建议,并强调合理搭配的重要性,避免资源浪费或瓶颈限制。内容实用,适合初学者和业务选型参考。
562 0
|
3月前
|
存储 消息中间件 缓存
从纳秒到毫秒的“时空之旅”:CPU是如何看待内存与硬盘的?
在数据爆炸的时代,如何高效存储与管理海量数据成为系统设计的核心挑战。本文从计算机存储体系结构出发,解析B+树、LSM树与Kafka日志结构在不同数据库中的应用与优化策略,帮助你深入理解高性能存储背后的原理。
124 0
|
2月前
|
弹性计算 定位技术 数据中心
阿里云服务器配置选择方法:付费类型、地域及CPU内存配置全解析
阿里云服务器怎么选?2025最新指南:就近选择地域,降低延迟;长期使用选包年包月,短期灵活选按量付费;企业选2核4G5M仅199元/年,个人选2核2G3M低至99元/年,高性价比爆款推荐,轻松上云。
162 11
|
5月前
|
存储
阿里云轻量应用服务器收费标准价格表:200Mbps带宽、CPU内存及存储配置详解
阿里云香港轻量应用服务器,200Mbps带宽,免备案,支持多IP及国际线路,月租25元起,年付享8.5折优惠,适用于网站、应用等多种场景。
1699 0
|
4月前
|
弹性计算 前端开发 NoSQL
2025最新阿里云服务器配置选择攻略:CPU、内存、带宽与系统盘全解析
本文详解2025年阿里云服务器ECS配置选择策略,涵盖CPU、内存、带宽与系统盘推荐,助你根据业务需求精准选型,提升性能与性价比。
|
5月前
|
存储 弹性计算 固态存储
阿里云服务器配置费用整理,支持一万人CPU内存、公网带宽和存储IO性能全解析
要支撑1万人在线流量,需选择阿里云企业级ECS服务器,如通用型g系列、高主频型hf系列或通用算力型u1实例,配置如16核64G及以上,搭配高带宽与SSD/ESSD云盘,费用约数千元每月。
452 0
|
7月前
|
数据可视化 Linux iOS开发
Python测量CPU和内存使用率
这些示例帮助您了解如何在Python中测量CPU和内存使用率。根据需要,可以进一步完善这些示例,例如可视化结果或限制程序在特定范围内的资源占用。
273 22
|
11月前
|
存储 设计模式 监控
快速定位并优化CPU 与 JVM 内存性能瓶颈
本文介绍了 Java 应用常见的 CPU & JVM 内存热点原因及优化思路。
1044 166
|
9月前
|
存储 缓存 Linux
Linux系统中如何查看CPU信息
本文介绍了查看CPU核心信息的方法,包括使用`lscpu`命令和读取`/proc/cpuinfo`文件。`lscpu`能快速提供逻辑CPU数量、物理核心数、插槽数等基本信息;而`/proc/cpuinfo`则包含更详细的配置数据,如核心ID和处理器编号。此外,还介绍了如何通过`lscpu`和`dmidecode`命令获取CPU型号、制造商及序列号,并解释了CPU频率与缓存大小的相关信息。最后,详细解析了`lscpu`命令输出的各项参数含义,帮助用户更好地理解CPU的具体配置。
980 8

热门文章

最新文章