由于服务器每周末特定时间出现CPU告警问题,出现时间比较短所以用脚本抓取信息
1、shell脚本
#!/bin/sh
#加载环境变量
. /etc/profile
Date2=`date`
Date=`date +%Y%m%d`
base="/root/scripts"
time=`date +%H:%M:%S`
getPidInfo(){
#echo "监控开始"
#获取一次top指令去掉前面6行,判断第9列(CPU占用)大于一定数据,按照CPU排序,然后取第一条
data=$(top -b -d 1 -n 1 -u root |awk '{ if (NR > 6) print }' |awk '{ if ($9 > 10) print }' | sort -rn -k +9 | head -1)
array=(${data// / })
if [[ ${#array[@]} -gt 1 ]];
then
echo "当前时间为:$Date2" >> $base/overlog$Date.log
echo "当前CPU使用率为:${array[8]}" >> $base/overlog$Date.log
echo "当前内存使用率为:${array[9]}" >> $base/overlog$Date.log
echo "当前用户为:${array[1]}" >> $base/overlog$Date.log
echo "当前进程为:${array[0]}" >> $base/overlog$Date.log
echo "当前进程名称为:${array[11]}" >> $base/overlog$Date.log
echo "当前进程使用的CPU时间总计为:${array[10]}" >> $base/overlog$Date.log
echo "进程所在目录为:" >> $base/overlog$Date.log
ls -l /proc/${array[0]}/cwd* >> $base/overlog$Date.log
echo "进程类型为:" >> $base/overlog$Date.log
ls -l /proc/${array[0]}/exe* >> $base/overlog$Date.log
echo "当前线程对应进程信息" >> $base/overlog$Date.log
top -b -d 1 -n 1 -H -p ${array[0]} |awk '{ if (NR > 6) print }'| sort -rn -k +9 >> $base/overlog$Date.log
echo "当前堆栈信息开始:==================================================" >> $base/overlog$Date.log
jstack ${array[0]} >> $base/overlog$Date.log
echo "当前堆栈信息结束:==================================================" >> $base/overlog$Date.log
#else
# echo "CPU占有率状态正常" >> $base/overlog$Date.log
fi
}
#echo $time
#死循环执行到某个时间
until [[ "$time" > "10:33:00" ]]
do
echo "当前时间:$time " >> $base/overlog$Date.log
getPidInfo
sleep 1
time=`date +%H:%M:%S`
Date2=`date`
#echo "当前实际时间为:$time"
done
echo "到时间了$time " >> $base/overlog$Date.log
#给脚本加入可执行权限
chmod +x time.sh
2、定时任务crontab -e
#输入命令
crontab -e
#进入编辑模式输入脚本加路径
31 10 * * 3 /root/scripts/time.sh
3、环境变量问题
前期执行手动调用没有问题但是定时执行无法抓取到堆栈信息,后再脚本前面加入. /etc/profile后解决
##脚本头部加入. /etc/profile加载环境变量
. /etc/profile
网友评论