实在是被逼无奈,才想出如此招数!
服务器老是被攻击,cpu占用特别高,而且特别高的进程是httpd(我知道有程序漏洞,but程序不是我写的)。
httpd的占用已经达到99.8%了
第一种解决办法
当cpu占用超过95%同时60s间隔内httpd的 pid相同时候 则杀死该pid
代码:
#!/bin/sh # qiyulin to monitor used CPU record=0 while true; do cpu=$(top -b -n1 | grep "httpd" | head -1 | awk '{print $9}') pid=$(top -b -n1 | grep "httpd" | head -1 | awk '{print $1}') #cpu check result=${cpu/.*} if [[ $record == $pid ]];then kill -9 $pid;echo "$pid was killed";fi if [[ $result > 95 || $result == 100 ]];then let record=${pid};else let record=0;fi #echo echo `date +%F" "%H:%M:%S`+" cpu:$result% record pid:$record pid:$pid" sleep 60 done
这样服务器平稳的运行了一段时间,至少保证不会再死了,后来又出现了状况2
第二种情况
top中没有特别高的cpu占用,但是总的mem占用超过了99%
唉!表示很无奈,怎么办呢? 当used使用超过95%的值的时候则 重启httpd
代码:
#!/bin/sh # qiyulin to monitor used CPU record=0 while true; do cpu=$(top -b -n1 | grep "httpd" | head -1 | awk '{print $9}') pid=$(top -b -n1 | grep "httpd" | head -1 | awk '{print $1}') #cpu check result=${cpu/.*} if [[ $record == $pid ]];then kill -9 $pid;echo "$pid was killed";fi if [[ $result > 95 || $result == 100 ]];then let record=${pid};else let record=0;fi #mem check mem=$(free -m | awk 'NR==2 {print $3}') if [[ $mem > 3638 ]];then apache-restart;echo "$mem is out 95%,so the httpd restart";fi #echo echo `date +%F" "%H:%M:%S`+" cpu:$result% record pid:$record pid:$pid mem:$mem" sleep 60 done
无奈之举....
哦对了,忘了说了这里如果想要 你写的脚本在后台飞~~~
需要使用命令如下:
nohup sh ./checkCpu.sh &
这样用户 即使退出则该脚本也会继续运行!
如何杀死该脚本
ps -ax #查看所有的进程pid kill -9 pid //杀死一个某个pid