shell編程很強大!
網站訪問量大的時候mysql的壓力就比較大,當mysql的CPU利用率超過300%的時候就不能提供服務了,近乎卡死狀態,這時候最好的方法就是重啟mysql服務。由於這種事具有不可預見性,我們不知道什麼時候mysql的佔用率達到300%,還是寫個程式定期判斷比較靠譜。
學了shell編程,寫了下面的指令碼:
#!/bin/bashcpu=`ps aux | grep 'mysqld$' | cut -d " " -f6 | cut -d. -f1`if [ $cpu -gt 300 ]then service mysql restart && date >> /tmp/mysql.logfi
稍微解釋一下。首先執行"ps aux"命令擷取所有系統進程的狀態資訊,包括CPU,記憶體等,如:
然後通過管道將資訊傳送給grep,$就是Regex結尾的意思,從所有的進程中找到以“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