脚本
#!/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=================================================
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