Shell - 监控某个进程的内存占用情况、主机CPU、磁盘空间等信息以及守护进程
生活随笔
收集整理的這篇文章主要介紹了
Shell - 监控某个进程的内存占用情况、主机CPU、磁盘空间等信息以及守护进程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 腳本
- 啟動的兩種方式
- 方式一 注冊到系統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、磁盘空间等信息以及守护进程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring5源码 - 09 循环依赖解
- 下一篇: Shell - 通过hook文件后门实现