shell編程很強大!網站訪問量大的時候mysql的壓力就比較大,當mysql的CPU利用率超過300%的時候就不能提供服務了,近乎卡死狀態,這時候最好的方法就是重啟mysql服務。由於這種事具有不可預見性,我們不知道什麼時候mysql的占用率達到300%,還是寫個程序定期判斷比較靠譜。
學了shell編程,寫了下面的腳本:
#!/bin/bash cpu=`ps aux | grep 'mysqld$' | cut -d " " -f6 | cut -d. -f1`
if [ $cpu -gt 300 ]
then
service mysql restart && date >> /tmp/mysql.log
fi
稍微解釋一下。首先執行"ps aux"命令獲取所有系統進程的狀態信息,包括CPU,內存等,如下圖:
然後通過管道將信息傳送給grep,$就是正則表達式結尾的意思,從所有的進程中找到以“mysqld”結尾的進程,其實就是mysql啦,這裡返回的是mysql進程的信息,一行,如下圖:
接下來的一個cut是截斷字符串,我們要統計的是CPU的占用率,當然要截取mysql的CPU數值,cut命令默認是用tab分割的,但是ps aux顯示的字符串中的空白是空格而不是tab,我們就要用空格來分割,有的字符串之間是多個空格,這裡的 -f8 參數就是截取第8個字符串(有的系統可能是第6個),這個字符串就是mysql的CPU占用率啦!
也許你會有疑問,既然已經得到mysql的CPU占用率了,為什麼後面還有一個cut?問的好!我當初也沒想到這個問題。因為我們要比較CPU的占用率嘛,這裡我們取得的字符串是一個浮點數(帶小數點的),但是shell編程裡面是不支持浮點數比較大小的。怎麼辦?那就比較整數呗,以“.”分割這個浮點數,第一個就是整數部分,這樣我們就取得了mysql占用率的整數部分。
後面就是一個判斷,如果大於300的話就就重啟mysql服務。後面還有一個命令,這個命令是一個簡單的“日志”,目的就是當重啟一次服務就記錄一下重啟mysql的時間,便於以後分析網站的壓力情況。
接下來就是定期執行這個程序了,根據情況可以5分鐘或者10分鐘執行一次,只要編輯 /etc/crontab文件,加入如下語句:
*/5 * * * * root /home/ma6174/mysql_restart.sh