Shell - 监控某个进程的内存占用情况、主机CPU、磁盘空间等信息以及守护进程
【摘要】
文章目录
脚本启动的两种方式方式一 注册到系统Cron方式二
运行结果linux内存、cpu、磁盘IO
脚本
#!/bin/sh
#####################...
脚本
#!/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
- 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
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
启动的两种方式
方式一 注册到系统Cron
registMonitor(){
echo "*/5 * * * * sh ${current_path}/MonitorES.sh 95" > /var/spool/cron/root
}
- 1
- 2
- 3
这种方式有个缺点,没法停止服务,除非把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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
运行结果
一天一个文件 ,注意清理
==========================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=================================================
- 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
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
- 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
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
文章来源: artisan.blog.csdn.net,作者:小小工匠,版权归原作者所有,如需转载,请联系作者。
原文链接:artisan.blog.csdn.net/article/details/108844670
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)