對一位系統管理者而言,這邊指的系統不是一般的網路、防火牆喔,這邊指的系統是指網站、資料庫主機等,常常在多使用者連上來後整個主機效能 CPU 上到滿載,當 CPU 一直保持著滿滿的進程的時候,這時候不管對主機下任何命令都會無效,當然遇到 DDOS 攻擊時更是無法招架,這時候怎麼辦呢?

難道沒有一種機制當我們得知CPU已經被不正常操到 90% 以上,我們就把吃資源最重的那支程式服務給關閉然後再重啟,以下為程式碼,只要把程式碼貼上產生一個 .sh 的 shell 檔,然後排定在 CRON 上固定去執行即可。

以下以 httpd 這個網站 Apache 的服務為例,如果要改為 mysqld 或任何服務只要將 httpd 替換掉即可。

#!/bin/sh
TOP_SYS_LOAD_NUM=20
SYS_LOAD_NUM=`uptime | awk '{print $(NF-2)}' | sed 's/,//'`

echo $(date +"%y-%m-%d") `uptime`
if [ `echo "$TOP_SYS_LOAD_NUM < $SYS_LOAD_NUM"|bc` -eq 1 ]
then
echo "##" $(date +"%y-%m-%d %H:%M:%S") "pkill httpd" `ps -ef | grep httpd | wc -l`
pkill httpd
sleep 10
for i in 1 2 3
do
if [ `pgrep httpd | wc -l` -le 0 ]
then
service httpd restart
sleep 30
echo "##" $(date +"%y-%m-%d %H:%M:%S") "restart httpd" `ps -ef | grep httpd | wc -l`
fi
done
else
if [ `pgrep httpd | wc -l` -le 0 ]
then
service httpd restart
sleep 30
echo "##" $(date +"%y-%m-%d %H:%M:%S") "restart httpd" `ps -ef | grep httpd | wc -l`
fi
fi

 

在 Cron 裡面排入,例如我把檔案放在 root 底下的 checkload.sh ,指令如下:

/root/checkload.sh >>/root/checkload.log       

這語法會產生一個 log 日誌檔,可以用這個檔案來觀看你的 CPU 的狀態,例如我在 Cron 排定 1 分鐘運行一次,那一天就會產生 1440 行的記錄,每分鐘記錄 CPU 的狀態。

文章標籤
全站熱搜
創作者介紹
創作者 ζ 修 - Hugo - 的頭像
ζ 修 - Hugo -

ζ 修 - Hugo -

ζ 修 - Hugo - 發表在 痞客邦 留言(0) 人氣(150)