shell自己是很是強大的,而工程師在追查線上問題時,如何可以更加快速更加有效的定位問題,用好shell很是關鍵。下面是我總結的幾個在追查問題時經常使用的shell命令。你們能夠參考下。你們有好的命令,也能夠在這之上完善。html
一、日誌分析類:shell
(1)性能
cut -d ‘’ -f4 wap_log |sort |uniq -c
好比cpu idle急劇降低,要看一下當前的流量如何,是不是因爲流量突增引發。可使用該命令:日誌
其中wap_log是日誌名,4 是時間那一列,簡單介紹下這個shell命令。htm
這是一行實例日誌行:排序
218.203.63.190 - - [09/Feb/2012:12:15:03 +0800] "GET /view/102795.html HTTP/1.1" 200 4557 "-" "MAUI WAP Browser" "jid=XKYGPzLXwG!70061790;$path=/" 76進程
在這個shell命令中,cut先根據空格分隔符對日誌行進行分割,而後取第4個field,也就是時間,取到時間後,對時間進行排序,排序後,再去重,計數。這樣就能夠輸出每一個時間段的日誌瀏覽量。內存
下面是改shell的輸出實例:同步
18 [09/Feb/2012:12:54:51it
14 [09/Feb/2012:12:54:52
11 [09/Feb/2012:12:54:53
10 [09/Feb/2012:12:54:54
12 [09/Feb/2012:12:54:55
15 [09/Feb/2012:12:54:56
11 [09/Feb/2012:12:54:57
第一列是個數,第二列是時間,固然,也能夠針對於這個在後面再用awk任意發揮,好比找出瀏覽量大於x的時間段,等等。這樣就能夠清楚的看到,每一個時間點的請求數,從而斷定是不是請求數過大致使。
(2)
cat access_log |awk 'BEGIN{sum=0;count=0;}{sum+=$NF;count++;}END{printf("sum=%d,count=%d,avg=%f\n",sum,count, sum/count)}'
access_log爲日誌名,用awk切割後,$NF爲最後一個域,就是耗時域,因此這條命令的做用就是計算平均耗時。
下面是該shell的實例輸出:
sum=3121224,count=96000,avg=32.512750
二、性能分析類:
(1)
ps aux | sort –n –k 5 | tail
獲得耗內存最大的10個進程。
ps aux 就不用解釋了,後面sort,-n表明按照數字大小進行排序,-k表明排序的key 6 表明第6列,第6列就是佔用內存大小列。
下面是輸出:
** 11800 0.0 0.0 261652 49316 ? S 2011 3:32 **.
** 11801 0.0 0.0 261652 49316 ? S 2011 3:33 **.
** 11802 0.0 0.0 261652 49316 ? S 2011 3:33 **.
** 11803 0.0 0.0 261652 49316 ? S 2011 3:33 **.
** 11804 0.0 0.0 261652 49316 ? S 2011 3:33 **.
** 11805 0.0 0.0 261652 49316 ? S 2011 3:32 **.
** 25511 0.0 0.0 261652 49316 ? S 2011 1:15 **.
** 25512 0.0 0.0 261652 49316 ? S 2011 0:00 **.
** 28391 1.4 0.5 547488 369664 ? Ssl Jan16 501:58 **
(**爲用戶名和進程名,已隱藏。)
(2)
ps aux | sort –n –k 4 | tail
同理,這是獲得cpu消耗最大的10個進程
(3)
lsof
固然lsof不屬於性能分析類,可是該命令又常常會用到:
lsof filename
顯示開啓filename這個文件的進程名
lsof –i:8099
查看開啓8099端口的進程
(4)
netstat
查找端口的進程名除了用lsof外,也能夠用netstat,
直接netstat –nlp | grep port便可
不過通常只有root權限才能夠用lsof,普通用戶的話,可使用/usr/sbin/lsof 不過通常沒有太多有價值的信息。
三、其餘類:
(1)rsync命令
rsync命令通常用來和線上機同步代碼,那他和scp有什麼不一樣呢? 一個是rsync命令能夠方便的exclude,scp沒法方便的exclude.另外,有一個很重要的不一樣是,rsync能夠保持軟鏈,但scp不能保持軟鏈。就是說,scp在執行過程當中,不會識別軟鏈,而是直接當作普通文件夾來處理。另外,比較重要的是,rsync爲增量同步,scp爲全量
通常同步命令以下:
rsync -av –bwlimit=2000 –progress –exlude=」log」 源地址 目標地址
-av這個參數你們能夠到網上搜下,這裏就再也不詳解了,av這個參數,若是沒有特殊需求,就把這個參數帶上。
--bwlimit是限速,單位是kb
--progress表明是顯示同步進度
--exclude表明,不一樣步的文件夾,這個文件夾是基於源地址的,也就是說好比exclude寫的是log,源地址寫的是/home/xx/ 那麼,不一樣步的文件夾就是/home/xx/log。
好,對於shell命令,我就先寫這麼多,你們也能夠基於這些命令自由發揮,拼接出更有價值的命令。