實時監視Linux中的進程

作者信息:瀋陽銀行卡網絡服務中心 石立

  多用戶的Linux系統在運行過程中,有時運算速度會突然慢下來,甚至從鍵盤輸入字符也得過好久纔會有反應。一般地,出現這種情況的原因是計算機在運行一個非常耗費CPU的進程。這樣的進程有時是某個人在執行一個很佔CPU的程序,例如程序進入了死循環,有時則可能是系統中出了什麼意外情況,系統本身在進行處理。無論是哪一種情況,系統管理員都應及時找出這樣的進程,並做出相應的處理。

  Linux雖然提供了一些處理程序,但這些程序只能在進程結束後才能顯示運行時間和佔用的CPU時間等信息,不能實時計算單位時間內哪一個進程佔用的CPU時間較多。筆者用shell語言編寫了一段程序,利用Linux提供的一些實用程序,實現了對進程的實時監視。

實用程序

  shell中使用了 ps、cut、diff等Linux實用程序,它們的功能簡單介紹如下:

● ps : 用來顯示當前系統中進程的有關信息,加-e 參數顯示系統中所有進程的簡單信息,使用 -f 參數則顯示各進程完整的信息;
● cut: 用於以列爲單位對文件進行剪裁,參數 “-c -15,33-”表示把輸入文件每行頭15個字符及第33個字符以後直到行尾的所有字符放入輸出文件;
● echo:用於在屏幕上顯示提示信息;
● sleep:可以讓 shell 程序等待若干秒,然後再執行下面的語句;
● diff: 用於對兩個文件進行比較,並把不同之處顯示出來;
● sort: 用於對文件中的各行進行排序,可以顯示排序結果;
● grep:用來找出文件中滿足一定條件的行,參數“^”表示找出第一列爲空格的各行。

  另外,程序中“|”爲管道符號,可實現把前面命令的輸出作爲後面命令的輸入的功能,這樣就可省略生成中間文件的步驟,提高執行效率。“>”表示對輸出進行重定向,把本來應顯示在屏幕上的東西輸出到文件中。

shell程序

  shell程序首先取得系統中所有進程的信息並把其中有用的字段放入臨時文件 tt1 中。接着讓程序等待20秒鐘(時間可依具體情況進行調整)。然後再一次取得所有進程的信息,並把所有的字段放入臨時文件 tt2 中。這時對兩個臨時文件進行比較,找出前後20秒信息不同的那些進程(其中就有消耗CPU時間已經發生了變化的進程)。去掉進行比較時產生的“>”和“<”,把結果存入臨時文件tt3中。然後對tt3中的內容進行排序,把耗費CPU時間發生變化的同一進程的前後信息排在一起。

ps -ef|cut -c -15,33->tt1
echo Please wait a while...
sleep 20
ps -ef|cut -c -15,33->tt2
echo Attention !
echo =========================
diff tt1 tt2|cut -c 2->tt3
sort tt3|grep ‘^ ’|cut -c -83|grep -v 0:00
echo =========================
echo That is ok!
rm tt1 tt2 tt3

  上述grep‘^ ’是用來去掉執行此shell程序時產生的一些中間命令進程的信息。再用cut刪去每行中過長的進程信息,使輸出更加清晰。而grep -v 0:00 則用來去掉前後20秒只出現過一次的進程。這樣,在前後20秒耗費CPU時間不同的進程就顯示在屏幕上了,從中可以很容易地找出出現問題的進程。最後,爲了不在系統中留下無用的垃圾文件,還要把3個臨時文件全都刪除。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章