文章目录

  • 脚本
  • 启动的两种方式
    • 方式一 注册到系统Cron
    • 方式二
  • 运行结果
  • linux内存、cpu、磁盘IO


脚本

 #!/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>&1free -m | awk 'NR==2{printf "Memory Usage: %s/%sMB (%.2f%%)\n", $3,$2,$3*100/$2 }' >>$LOG_FILE 2>&1df -h | awk '$NF=="/"{printf "Disk Usage: %d/%dGB (%s)\n", $3,$2,$5}' >>$LOG_FILE 2>&1top -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>&1EsMemoryRatio=$(printf "%d%%" $(($MemorySizeOfES*100/$MemorySizeOfServer)))echo "ES内存/总内存:$MemorySizeOfES/$MemorySizeOfServer=$EsMemoryRatio " >>$LOG_FILE 2>&1if [ "$MemorySizeOfES" = "" ]; thenMemorySizeOfES=0fiif [ "$MemorySizeOfServer" = "" ]; thenMemorySizeOfServer=0fiif [ $MemoryRatio -ge $THREOD ]; then # do something  TODOecho "当前主机内存使用$MemoryRatio 大于阈值 $THREOD, Do Action"   >>$LOG_FILE 2>&1 else echo "当前主机内存使用$MemoryRatio 小于阈值 $THREOD, Do Nothing"   >>$LOG_FILE 2>&1fi}echo "==========================begin  `date "+%Y-%m-%d %H:%M:%S"`===============================================" >>$LOG_FILE 2>&1if [ -z ${PID} ];thenecho "The $PROCESS does not exist." >>$LOG_FILE 2>&1exit EXIT_FAILURE
fi RecordCurrentUsage
CalcCurrentMemoryRatio
ExecStrategyecho "==========================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 ]
doAdminProcNum=`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 ]thenecho "start" >> /xxx.log su elasticsearch<<!cd $ES_HOME./bin/elasticsearch -dexit
!echo "--------------------------- Elasticsearch Started By Watcher  $(date "+%Y-%m-%d %H:%M:%S")----------------------------------------" >> ${logfile}  2>&1 fisleep 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=================================================


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

详解

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

  1. 进程的内存占用情况分析

    我们都知道进程运行时,会有一个栈空间(stack)和一个堆空间(heap), 栈空间用于函数调用和局部变量,堆空间是C语言的 malloc 来分配的全局指针.这些都是进程的私有数据,除了这些,还有映射 ...

  2. mysql lsof打开数过多_lsof 查看进程打开的文件情况 df -h 磁盘空间满的异常处理...

    lsof的使用说明 2019/07/01 update chenxin lsof 查看进程打开了哪些文件 / 查看文件被哪个进程使用 lsof -u/-c/-p/^/file_path_and_fil ...

  3. JAVA获取当前进程的内存占用数和CPU利用率以及读写字节数并计算统计信息

    通过oshi这个三方库来获取,目前这个最准确. 引入依赖 <dependency><groupId>com.github.oshi</groupId><art ...

  4. win10 中午未使用 内存占用增高_清理磁盘空间【win10篇】

    电脑配置:128GB固态硬盘+1TB机械硬盘,8G内存 无意中发现我的 128g c盘竟然只有20g的可用内存了,可是我并没有在c盘中安装很多软件,为什么会占用这么多内存呢?遂百度,得结果如下. 1. ...

  5. Shell脚本和Python查看Nginx并发连接数、进程数和常驻内存占用情况

    Shell脚本查看Nginx并发连接数.进程数和常驻内存占用情况 http://xiaoyongxing1.blog.163.com/blog/static/642807522015144302240 ...

  6. LINUX进程内存占用情况如何查看的方法

    在系统维护的过程中,随时可能有需要查看 CPU 使用率,并根据相应信息分析系统状况的需要.在 CentOS 中,可以通过 top 命令来查看 CPU 使用状况.运行 top 命令后,CPU 使用状态会 ...

  7. 查看LINUX进程内存占用情况 top pmap ps

    可以直接使用top命令后,查看%MEM的内容.可以选择按进程查看或者按用户查看,如想查看oracle用户的进程内存使用情况的话可以使用如下的命令: (1)top top命令是Linux下常用的性能分析 ...

  8. 查看LINUX进程内存占用情况

    可以直接使用top命令后,查看%MEM的内容.可以选择按进程查看或者按用户查看,如想查看oracle用户的进程内存使用情况的话可以使用如下的命令: (1)top top命令是Linux下常用的性能分析 ...

  9. 检测指定进程的CPU和内存占用情况

    '检测指定进程的CPU和内存占用情况'vs2019 vb.net Dim Name = Process.GetCurrentProcess().ProcessNameDim cpuCounter = ...

最新文章

  1. 关于Verilog HDL的一些技巧、易错、易忘点(不定期更新)
  2. 【转】PowerDesigner表结构和字段大小写转换
  3. Powershell Module for Netapp Data Ontap
  4. Git使用汇总之暂存区工作区撤销和删除
  5. poj 2455 Secret Milking Machine(二分枚举+最大流)
  6. python爬虫今日头条_python爬虫—分析Ajax请求对json文件爬取今日头条街拍美图
  7. php获取url文件大小,PHP通过URL获取文件大小
  8. php计算200以内偶数的和并输出_如何用PHP实现数组中偶数位置元素大于奇数位置元素?...
  9. 全国计算机等级考试题库二级C操作题100套(第37套)
  10. 10年IT老兵酒后吐真言,我看了5遍...
  11. Q102:光线追踪场景(3)——Two Horses
  12. 使用Python来调用电脑音响
  13. 最简单的字符串算式计算方法
  14. (转)是时候说说Pivotal这个富二代了!
  15. mysql集群session_集群session解决方案
  16. 我的第一个游戏FoodieThebug完成之后的心得体会 -子龙山人
  17. matlab shift 详解,MeanShift算法详解以及matlab源码
  18. python:Craps赌博游戏
  19. Arduino实训-可移动机械臂(智能小车)
  20. iTween之iTweenPath的使用

热门文章

  1. WSL安装Oracle,WSL安装JDK8 - terwergreen的个人空间 - OSCHINA - 中文开源技术交流社区...
  2. android 之多线程详解
  3. TensorFlow 莫烦 手写识别 cross_entry (五)
  4. 28. Leetcode 25. K 个一组翻转链表 (链表-反转链表)
  5. Albert: A lite bert for self-supervised learning of language representations (Albert)
  6. tkinter 笔记: radiobutton 选择按钮(莫烦python笔记)
  7. 概率统计笔记:高斯威沙特分布
  8. Flink从入门到精通100篇(二十四)-对Flink SQL Client 源码做深度解析
  9. 听说你想去大厂看妹子,带你看看阿里软件测试岗四轮面试是怎么样的?
  10. 深度神经网络(DNN)损失函数和激活函数的选择