1.1 cpu负载过高java进程

cat > java_cpu_check.sh << 'EOF'
!/bin/bash
##检测是否安装iostat工具
##stress --cpu 4 --timeout 60 通常使用stress压测cpu触发脚本是否执行成功

##判断目录是否存在
# 定义目录路径
dir_logs=/data/script/logs

# Java进程的关键词,可以根据实际情况修改
keyword=".jar"

# 循环执行次数
num_iterations=3

# 循环间隔时间(秒)
sleep_time=5

# 定义cpu5分钟的告警触发阀值数值:Load average:5分钟超过3 则执行以下采集命令
threshold=3

# 判断目录是否存在
if [ -d "$dir_logs" ]; then
  echo "目录已存在,无需创建。"
else
  echo "目录不存在,创建目录:$dir_logs"
sudo mkdir -p $dir_logs && sudo chown -R admin.admin $dir_logs
fi

# 获取5分钟平均负载
load=$(uptime | awk '{print $(NF-2)}' | cut -f1 -d',')
echo "5分钟平均负载: $load"

echo "开始执行cpu负载判断"
if (( $(echo "$load > $threshold" | bc -l) )); then
    # 获取所有符合关键词的Java进程PID和服务名称,并循环执行jmap、jstack和jstat命令
    for ((i=1;i<=$num_iterations;i++)); do
        echo "Iteration $i:"

        # 获取所有符合关键词的Java进程PID和服务名称
        pids=$(jps | grep "$keyword" | awk '{print $1}')
        names=$(jps | grep "$keyword" | awk '{print $2}')
       # 定义日志文件
       java_logs="${dir_logs}/jmap_jstack_jstat_${name}_${pid}.txt"
	   
        echo "开始遍历循环执行jmap、jstack和jstat命令"
        for pid in $pids; do
          # 获取服务名称
          name=$(echo "$names" | sed -n "$(echo "$pids" | grep -n $pid | cut -d':' -f1)p")

          # 执行jmap命令
          echo "$(date) Running jmap -heap $pid">> $java_logs
          jmap -heap $pid >> $java_logs

          # 执行jstack命令
          echo "$(date) Running jstack -l $pid">> $java_logs
          jstack -l $pid >> $java_logs

          # 执行jstat命令
          echo "$(date) Running jstat -gcutil $pid">> $java_logs
          jstat -gcutil $pid >> $java_logs
        done

        # 休眠指定时间
        sleep $sleep_time
    done

else
  echo "$(date) 负载未超过1,无需执行"
fi
EOF

1.2 cpu抓取

cat > cpu_check.sh << 'EOF'
#!/bin/bash
##检测是否安装iostat工具
##stress --cpu 4 --timeout 60 通常使用stress压测cpu触发脚本是否执行成功

##判断目录是否存在
# 定义目录路径
dir_logs=/data/script/logs

# 定义cpu5分钟的告警触发阀值数值:Load average:5分钟超过3 则执行以下采集命令
threshold=3 


# 判断目录是否存在
if [ -d "$dir_logs" ]; then
  echo "目录已存在,无需创建。"
else
  echo "目录不存在,创建目录:$dir_logs"
  sudo mkdir -p $dir_logs
fi

##判断命令是否存在
if ! command -v iostat &> /dev/null
then
    echo "iostat command not found, installing..."
    sudo yum install -y sysstat
fi

if ! command -v iotop &> /dev/null
then
    echo "iostat command not found, installing..."
    sudo yum install -y iotop
fi

#5分钟负载大于XX则触发分析命令并存储
logs_file="${dir_logs}/cpu-$(date +"%Y-%m-%d_%H:%M:%S").logs"

uptime | awk -F 'load average: ' '{print $2}' | awk -F ', ' '{print $2}' | while read load; do
  if (( $(echo "$load > ${threshold}" | bc -l) )); then
    echo "故障" >> ${logs_file}
    echo "以下是详细信息:" >> ${logs_file}
    echo "1 内核产生的信息:dmesg | awk -F: '{print $1}' | sort | uniq -c | sort -rn | head -n 10" >> ${logs_file}
    dmesg | awk -F: '{print $1}' | sort | uniq -c | sort -rn | head -n 10 >> ${logs_file}
    
    
    echo "3 CPU每个计算核心的使用情况: mpstat -P ALL 5 2" >> ${logs_file}
    mpstat -P ALL 5 2 >> ${logs_file}
    
    echo "4 cpu利用率分析: sar -u 2 10" >> ${logs_file}
    sar -u 2 10 >> ${logs_file}
    
	echo "4 cpu的io进程: iotop -oP" >> ${logs_file}
    iotop -oP >> ${logs_file}
	
    echo "5 磁盘信息:iostat -x 1 3" >> ${logs_file}
    iostat -x 1 3 >> ${logs_file}
    
    echo "6 系统负载统计:vmstat 5 10" >> ${logs_file}
    vmstat 5 10 >> ${logs_file}
    
    echo "7 进程信息:ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu | head -n 11" >> ${logs_file}
    ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu | head -n 11 >> ${logs_file}
    
	echo "2 进程数统计: ss -s"  >> ${logs_file}
    ss -s  >> ${logs_file}
	
    echo "8 监控进程:pidstat  2 2" >> ${logs_file}
    pidstat  2 2 >> ${logs_file}
  fi
done
EOF