【需求】
寫一個(gè)監(jiān)控腳本,監(jiān)控系統(tǒng)負(fù)載,如果系統(tǒng)負(fù)載超過10,需要記錄系統(tǒng)狀態(tài)信息。
提示:
1)系統(tǒng)負(fù)載命令使用uptime看,過去1分鐘的平均負(fù)載
2)系統(tǒng)狀態(tài)使用如下工具標(biāo)記:top、 vmstat、 ss
3)要求每隔20s監(jiān)控一次
4)系統(tǒng)狀態(tài)信息需要保存到/opt/logs/下面,保留一個(gè)月,文件名建議帶有`date +%s`后綴或者前綴
【解析】
這是一個(gè)監(jiān)控腳本,對于監(jiān)控腳本,通常有兩種思路
一個(gè)是做一個(gè)死循環(huán),讓它一直跑著,每檢測一次,中間間隔一段時(shí)間,比如本題要求的20s
另外一種是一分鐘執(zhí)行一次,利用系統(tǒng)的任務(wù)計(jì)劃,每分鐘執(zhí)行
本案例要求每20s監(jiān)控一次,所以只能使用第一種,死循環(huán)
死循環(huán),使用while :; do ...; done
這里的 : 你可以理解成條件為真
再來看腳本要求,監(jiān)控系統(tǒng)負(fù)載,超過10就記錄系統(tǒng)狀態(tài)信息
問題的關(guān)鍵點(diǎn)在于,如何獲取到系統(tǒng)負(fù)載的值
系統(tǒng)負(fù)載,在Linux里面可以使用w或者uptime或者top命令都可以獲取到
這里的load average 后面的三個(gè)數(shù)字就是系統(tǒng)負(fù)載,它們分別表示過去1分鐘、5分鐘、15分鐘內(nèi)系統(tǒng)的平均負(fù)載
為了更加精準(zhǔn),我們需要選擇1分鐘的平均負(fù)載
那這個(gè)負(fù)載到底代表著什么含義呢?
就拿這個(gè)1分鐘負(fù)載來說,這個(gè)數(shù)字表示,過去1分鐘,平均有多少個(gè)進(jìn)程在使用CPU資源
使用CPU資源的進(jìn)程越多,那就意味著CPU越忙
那,這個(gè)數(shù)字為多少是合適呢?
這取決于你的系統(tǒng)里有多少顆CPU,這個(gè)數(shù)字不是物理CPU,指的是邏輯CPU個(gè)數(shù),那如何查看?
使用lscpu命令看
比如,你系統(tǒng)有8顆CPU,那么系統(tǒng)負(fù)載為8時(shí),表示1顆CPU處理一個(gè)進(jìn)程,這樣CPU沒有空閑也不忙,是最合適的
好了,說完系統(tǒng)負(fù)載,再回頭看腳本
如何拿到這個(gè)1分鐘的負(fù)載數(shù)值呢?
這就需要借助sed awk 以及 cut等各種處理字符串的工具了
uptime |awk -F 'average:' '{print $2}'
首先將三個(gè)數(shù)字打出來,然后想辦法截取第一個(gè)數(shù)字
此時(shí),可以使用cut來截取
這時(shí)候出現(xiàn)的結(jié)果還不是最終的數(shù)字,還需要將最前面的空格去掉,而且我們不需要小數(shù)點(diǎn)以及后面的數(shù)字
使用sed將空格去掉
再使用cut將小數(shù)點(diǎn)前面的數(shù)字截取
其實(shí),寫腳本就需要大家一步一步地去嘗試
拿到負(fù)載值之后,再去和10做比較
可以先將負(fù)載值賦值到變量里,然后用變量去做比較
if [ $load -gt 10 ]; then ...; fi
如果負(fù)載值高于10,就需要記錄系統(tǒng)狀態(tài)信息
題目也提示我們了,獲取系統(tǒng)負(fù)載的狀態(tài),有top vmstat 和 ss 三個(gè)命令
如果大家不會(huì)使用這幾個(gè)命令,那么腳本就無法寫出來了
所以,寫shell腳本的前提是,你必須要具備一定的認(rèn)知
top -bn1 可以一次性展示top的結(jié)果,但是沒必要將所有都記錄下來,只需要前100行就足夠了,因?yàn)槲覀冴P(guān)注的是排在最前面的幾個(gè)進(jìn)程
vmstat 命令可以記錄包括cpu、內(nèi)存、io等信息,用法是 vmstat n1 n2 , 其中n1和n2是兩個(gè)數(shù)字,前面的數(shù)字,表示幾秒鐘打印一次信息,后面的數(shù)字是打印幾次,建議是1秒1次,打印10次
所以最終用法啊是
vmstat 1 10
ss是用來查看網(wǎng)絡(luò)鏈接狀態(tài)的命令,這里需要使用
ss -an
有了記錄系統(tǒng)狀態(tài)信息的命令后,接下來就是要規(guī)劃,將這些信息記錄到哪個(gè)日志里
兩種思路,一個(gè)是一股腦全部記錄到一個(gè)文件里,每次記錄都是追加
另外一個(gè)思路是,針對top、vmstat、ss分別記錄日志
這里我選擇第二個(gè),這樣方便查看,題目中要求給這個(gè)日志加一個(gè)date +%s的時(shí)間戳作為后綴前綴或者后綴,那么就用后綴吧,比如:
top.`date +%s`, vmstat.`date+%s`, ss.`date +%s`
刪除掉一個(gè)月以前的,使用find查看即可,還需要注意,/opt/logs/下面有可能有其它日志,所以我們只需要針對本腳本產(chǎn)生的日志進(jìn)行搜索
find可以這樣做
find /opt/logs -name "top*" -o -name "vmstat*" -o -name "ss*"
說明一下,這里的-o表示或者的意思,如果不加-o,那么就是并且
find 還支持將一堆條件搞到一起,作為一個(gè)整體,需要使用(),例如
find /opt/logs ( -name "top*" -o -name "vmstat*" -o -name "ss*" ) -mtime +30
需要注意,小括號(hào)使用脫義符號(hào)脫義了,并且前后有空格
【參考答案】
腳本最終結(jié)果是這樣的:
#!/bin/bash [ -d /opt/logs ] || mkdir -p /opt/logs while : do load=`uptime |awk -F 'average:' '{print $2}'|cut -d',' -f1|sed 's/ //g' |cut -d. -f1` if [ $load -gt 10 ] then top -bn1 |head -n 100 > /opt/logs/top.`date +%s` vmstat 1 10 > /opt/logs/vmstat.`date +%s` ss -an > /opt/logs/ss.`date +%s` fi sleep 20 find /opt/logs ( -name "top*" -o -name "vmstat*" -o -name "ss*" ) -mtime +30 |xargs rm -f done
腳本運(yùn)行時(shí),丟入后臺(tái)去
著重提醒一下,有的同學(xué)將最后面這個(gè)load賦值或者find命令放到了while循環(huán)外面,
這是不對的,放到while循環(huán)前面它只會(huì)執(zhí)行一次,而放到while循環(huán)后面永遠(yuǎn)也不會(huì)執(zhí)行
審核編輯:湯梓紅
-
Linux
+關(guān)注
關(guān)注
87文章
11304瀏覽量
209483 -
監(jiān)控系統(tǒng)
+關(guān)注
關(guān)注
21文章
3914瀏覽量
174693 -
腳本
+關(guān)注
關(guān)注
1文章
389瀏覽量
14864
原文標(biāo)題:監(jiān)控系統(tǒng)負(fù)載記錄系統(tǒng)狀態(tài)
文章出處:【微信號(hào):aming_linux,微信公眾號(hào):阿銘linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評(píng)論請先 登錄
相關(guān)推薦
評(píng)論