-- 作者 謝恩銘 轉載請註明出處
內容簡介
- 第三部分第三課:監視系統活動,滴水不漏
- 第三部分第四課預告:後臺執行及合併多個終端
監視系統活動,滴水不漏
經過上一課 Linux探索之旅 | 第三部分第二課:流、管道、重定向,三管齊下 的錘鍊,現在大家對Linux的命令列應該有了新的認識,而且水準大概已經提高到了一個不錯的檔次。如果你還沒有,快,快去給我練習去~
上一課算是比較難的,大家都辛苦了。所以這課給大家輕鬆一下,可以愉快地學完~
放眼現在的作業系統,基本都是多工作業系統了,Linux當然也不例外。因此,Linux可以管理多個同時執行的程式。
通過之前的課程Linux探索之旅 | 第二部分第五課:使用者和許可權,有權就任性,我們知道,Linux也是一個多使用者的系統。多個使用者可以同時在不同地方通過網路連線到同一個Linux系統上進行操作。
多使用者多工的特點有好處,但也有隱患。可能某個使用者或者某個任務(其實就是執行著的程式)在某時讓Linux系統過載了,就是有點太累了,任務太繁重了。
這時,我們很可能想知道:
到底是哪個“小子”幹了這等好事?
是哪個程式膽敢宕我的系統?
如何才能停止一個不再響應的程式?
在Windows系統下,我們可能常聽說用超級組合鍵《Ctrl + Shift + Delete》來調出工作管理員,結束未響應的程式。
在Linux下,我們會用其他工具和別樣的技術來處理僵局。這一章我們會學到不少新的Linux命令。
閒話不說,我們開始學習吧。
w命令:都有誰,在做什麼?
第一個出場的命令是迄今為止我們遇到過的最短的命令,這個命令只有一個字母:w
就是這麼一個很簡單的命令,卻挺實用,它可以幫助我們快速瞭解系統中目前有哪些使用者登入著,以及他們在幹什麼。
如果你負責一臺Linux伺服器,有時候它會過載,變得很慢,這時你可以登入此伺服器,然後執行w命令,快速瞭解到底發生了什麼事。
但是對於大部分讀者,他們是在自己的個人電腦上學習本課程的,他們的Linux系統一般只登入了一個使用者,就是他們自己。所以用w命令之後,只顯示個人使用者的資訊。
如上圖所見,目前Linux系統中只有一個使用者登入,就是小編自己的使用者,名叫oscar。
w命令輸出的資訊雖然短,但是比較密集,看第一眼並不容易瞭解到底是什麼。但其實w命令給出的資訊非常有用。
我們將其分解成不同的部分來解釋,按照從上到下,從左到右的順序。
時間(用date命令也可以做到)
我們看到資訊的第一行中有 17:36:13,這就是當前時間:17點36分13秒。
我們之前學過date這個命令,它可以顯示當前日期,時間,和時區:
可以看到date命令顯示當前時間:Mon Sep 14 17:50:57 CEST 2015
Mon是Monday的縮寫,表示《星期一》。
Sep是September的縮寫,表示《九月》。
14是日期,表示14日。所以是9月14日。
17:50:57是當前時間。17點50分57秒。
CEST是歐洲中部夏令時間(Central European Summer Time,簡稱CEST),比世界標準時間(UTC)早兩個小時的時區。因為我在法國。
2015是年份,就是2015年。
date命令的輸出中的17:50:57就是w命令中的時間那部分。
執行時間(用uptime命令也可以做到)
w命令的輸出中,緊跟在當前時間後面的是 up 25 min
up是英語《執行正常的》的意思。min是英語minute的縮寫,表示《分鐘》。
所以 up 25 min 表示系統已經執行了25分鐘了,就是從開機登入到現在經過的時間。
這個資訊還是挺有用的,因為一旦系統重啟或關機,那麼執行時間會重歸0。
在Windows中,很多程式一旦安裝完成,經常會要求重啟系統來完成安裝。
但Linux中不需要如此,一般只有系統的核心升級才需要重啟系統。這也是Linux被大量用作伺服器的原因,因為一般網站的伺服器最好能夠7天24小時不重啟,一直執行。
系統正常執行時間一般就稱為uptime,Linux中有一個uptime命令可以顯示。
可以看到,uptime的輸出其實就是w命令的第一行的內容,一模一樣。
很多大型網站的伺服器,如果你用uptime命令來獲知其正常執行時間,可能會出現令你驚訝的好幾百天的結果。
Linux的穩定性和抗病毒性包您滿意
負載(同樣可以用uptime命令獲知)
在w命令的輸出的第一行的右邊,有三個數值,表示負載:
load average: 0.15, 0.11, 0.09複製程式碼
load是《負載,負荷》的意思,average是《平均值》的意思。負載是系統活動的一個指標:
這三個數值從左到右分別表示:
1分鐘以內的平均負載(0.15)。
5分鐘之內的平均負載(0.11)。
15分鐘之內的平均負載(0.09)。
這些數值具體表示什麼呢?
說起來稍微有點複雜。閱讀手冊,我們可以知道:這些數值表示一段時間內的平均活躍程式數(也就是使用CPU處理器的程式數。程式簡單地說就是執行起來的程式)。
由此可知,近1分鐘內平均有0.15個程式使用了處理器,也就是說處理器有15%的時間是活躍的。
負載的數值也取決於電腦的處理器的核心數目。一個單核的處理器如果負載超過了1,那就是過載了。雙核的處理器如果負載超過了2,那就是過載了。四核的處理器如果負載超過了4,那就是過載。依次類推。
有的伺服器過載的時候負載的數值甚至能達到50那麼多。
如果負載值在較長的時間中都維持比較大的話,就說明系統出問題了。我們可以用tload命令來繪製隨時間變化的負載《曲線》圖。
tload複製程式碼
tload命令的輸出(隨時間變化):
圖中橫座標是時間,縱座標的高低表示負載大小,左邊猛然上升的縱座標值是因為小編開啟了火狐瀏覽器。
登入的使用者列表(用who命令也可以做到)
w命令的輸出中,除去第一行,下面的行可以歸為一個部分,就是登入的使用者列表。
這幾行資訊顯示當下系統中連線的使用者是哪幾位,他們在做什麼任務,任務進行多長時間了。
可以看到,有兩行都是以oscar開頭,我目前是在自己的個人電腦上,所以Linux系統中只有我一個使用者登入,那為什麼有兩行oscar呢?我們先來了解下各列的意義,就會明白了。
USER:使用者名稱(登入名)。user是英語“使用者”的意思。
TTY:Linux中預設提供了六個命令列終端和一個圖形終端:tty1~tty7。其中tty1~tty6是命令列終端(就是全屏,黑底白字的控制檯,以前的Linux探索之旅 | 第二部分第一課:終端Terminal,好戲上場這一課介紹過),tty7是圖形終端(也就是平時我們啟動Ubuntu桌面版時預設登入的圖形使用者介面,也是全屏的)。Ubuntu中可以通過Ctrl+Alt+F1~F7切換這7個終端。除了這7個基本的《大環境》終端,我們還可以在tty7中開很多不是全屏的終端,也就是我們平時用來輸入命令列的圖形終端(ctrl + shift + T快捷鍵),這些終端的名字是以pts開頭的。pts是pseudo terminal slave的縮寫,表示“偽終端從屬”。如果我新開一個圖形終端,那麼顯示名稱為pts/0,如上圖中所示。如果我再開一個圖形終端,那麼它的名字就是pts/1。依次類推。
FROM:使用者連線到的伺服器的IP地址(或者主機名)。在我們的例子中,我們並沒有登入遠端伺服器,只是在本地自己的電腦上測試,所以FROM那列顯示的並不是實際的IP地址。from是英語“從...”的意思
LOGIN@:使用者連線系統的時間。login是英語“登入”的意思。
IDLE:使用者有多久沒活躍了(沒執行任何命令)。idle是英語“不活躍的”的意思。
WHAT:當下使用者正執行的程式。what是英語“什麼”的意思。
在小編的情況,我們看到有兩個使用者,有兩個oscar。第一個oscar對應的是登入Ubuntu系統的使用者,也就是我們開機後登入的使用者,進入的是Ubuntu的圖形使用者介面,可以從WHAT那列的資訊看出來,這裡是gnome-sessi,是gnome session(session是英語“會話”的意思)的縮寫,表示Gnome這個桌面系統。第二個oscar對應的是開啟當前我們正在操作的這個圖形終端的使用者,也是oscar,不過TTY那列是pts/0,WHAT那列是w,說明使用者執行了w命令。沒錯啊,因為這些資訊就是w命令執行的輸出結果。
w命令雖然很有用,但是給出的資訊還是不夠詳盡。我們下面來看看如何獲得詳細的系統程式的資訊。
ps命令和top命令:列出執行的程式
簡單說來,程式就是載入到記憶體中執行的程式。
大多數程式執行時都只在記憶體中啟動一個程式。例如Linux中的OpenOffice這個軟體。有的程式執行時卻會建立不少程式,例如Google的Chrome瀏覽器,每開一個標籤欄都會建立一個新的程式。
在網路伺服器上,一般我們都是用Apache這個軟體來傳送網頁給網民。Apache在執行時就會建立很多程式,分別負責不同的任務。一般的資料庫軟體,例如MySQL,PostgreSQL也是如此。
因此,假如你發現一個程式建立了好多個程式的話,並沒有什麼好吃驚的。
在Windows中,我們要檢視系統中執行的程式,會使用Ctrl + Alt + Delete快捷鍵,調出工作管理員,然後點選《程式》這個選單。
在Linux中,我們有兩個命令可以幫助我們檢視系統中執行的程式。
ps:程式的靜態列表
ps是Process Status的縮寫,process是英語《程式》的意思,status是《狀態》的意思,所以ps命令用於顯示當前系統中的程式。
ps命令顯示的程式列表不會隨時間而更新,是靜態的,只是執行ps命令當時的那個狀態,或者說是一個程式的快照,英語稱為snapshot,就好像照了一張照片一樣。
我們試著不加任何引數直接執行ps命令:
可以看到顯示結果有四列:
PID:程式號。pid是process identifier的縮寫。每個程式有唯一的程式號。之後我們學習如何結束程式時需要用到程式號。
TTY:程式執行所在的終端。
TIME:程式執行了多久。
CMD:產生這個程式的程式名。如果你在程式列表中看到有好幾行都是同樣的程式名,那麼就是同樣的程式產生了不止一個程式(例如MySQL程式)。
在小編的情況,我們執行ps命令時顯示了兩個程式正在執行,一個是bash,也就是操控當前終端的shell程式。另一個是ps命令自己。
兩個程式,這就是全部了?
當然不是。ps命令不帶引數使用時只會列出當前執行ps命令的使用者在當前這個終端中所執行的程式。有好多程式是root使用者執行的,就沒列出來。還有的程式,雖然也是當前使用者執行的,但不是在當前的終端裡,所以也沒列出來。
ps命令有很多不同的引數。你可以用man ps來檢視。可不要被眾多的選項引數嚇到。
我們不可能介紹每個引數,下面就介紹一些常用的引數吧。
ps -ef:列出所有程式
-ef引數可以使ps命令列出所有使用者在所有終端的所有程式。
ps -ef複製程式碼
可以看到,用了-ef引數,因為列出所有使用者的所有程式,所以比剛才不加引數的ps命令多了一些列。
例如第一列UID,是user identifier的縮寫,表示《使用者名稱》,也就是執行程式的使用者。
ps -efH:以喬木狀列出所有程式
ps -efH複製程式碼
比上面的-ef多加了一個H引數,可以使ps命令按照喬木狀列出程式。有的程式是某些程式的子程式。
比如上圖中,我們可以看到/sbin/init這個程式(程式)就啟動了其他的程式,比如udevd --daemon,portmap,smbd -F,等等。
ps -u 使用者名稱:列出此使用者執行的程式
ps -u複製程式碼
我們就用當前使用者來測試看看:
可以看到有不少程式,單獨用ps的時候只有兩個程式,那是因為有好多程式不是在pts/0那個終端裡執行的。
top:程式的動態列表
ps命令雖然強大,但有一個缺陷:是靜態的,只能記錄當下那一刻的程式列表。
但事實上,我們的系統是時刻變化的。有些程式這一秒在執行,下一秒可能就被終止了。所以ps命令並不能幫助我們實時監控系統的程式。
怎麼才能獲取一個隨時間一直在變的程式列表呢?就需要用到top命令了。
top複製程式碼
這個列表是互動性的,而且實時更新。
第一行,你可以看到當前時間(04:02:41,就是凌晨4點02分41秒),系統執行時間(3:52,也就是3個小時52分鐘),使用者數目(2 users,就是“兩個使用者”),平均負載(load average: 0.50, 0.34, 0.25)。
接下來的幾行,我們不過多解釋了,因為這涉及到作業系統的一些概念。
在下面,PID,USER,PR,NI,VIRT,RES,SHR,S,%CPU,%MEM,TIME+,COMMAND開始的那個列表就是程式列表了。
但為什麼相比之前ps -ef時程式少了這麼多呢?
因為top命令無法顯示全部的程式。它只顯示排在前面的一些程式,為了整個資訊區域正好佔據終端中一個頁面的大小。
預設地,這些程式是按照使用處理器的比率來排序的,從大到小(按照%CPU那一列的數值),最消耗處理器的程式排在最前面。所以如果你覺得自己的系統變慢了,過載了,檢視列表中最開始的幾個程式是個好主意。
前面說過了,top命令輸出的資訊頁面不但是動態變化的,而且是可互動的。
我們用一些鍵盤的按鍵可以控制top的顯示結果。
q:退出top
h:顯示幫助文件,也就是哪些按鍵可以使用。按下任意鍵返回。
B:大寫的B,加粗某些資訊。
f:在程式列表中新增或刪除某些列。
F:改變程式列表排序所參照的列。預設情況下,是按照%CPU那一列來排序。
u:依照使用者來過濾顯示。可以輸入使用者名稱,按回車。
k:結束某個程式。會讓你輸入要結束的程式的PID。
s:改變重新整理頁面的時間。預設地,頁面每隔3秒重新整理一次。
當然了,Linux下有很多優秀的軟體,做得比top和ps更好,例如:
Linux中比Top顏值更高的系統監控工具Glances
Ctrl + C和kill命令:停止程式
有時候,系統會卡住。這在Linux中也是會發生的。
在Linux中停止程式有幾種方法:
Ctrl + C:停止終端中正在執行的程式
Ctrl + C這個組合快捷鍵還是需要知道的,因為它可以比較友好地中止終端中正在執行的程式(程式),這個組合鍵也只在終端中會這樣執行,如果在普通的圖形介面中,它就是拷貝的快捷鍵,與Windows下無異。
順便講一個Linux下的小技巧,比如我們在終端下,用滑鼠選中一段文字,然後按一下滑鼠中間的滾輪,就會在終端裡黏貼選中的文字。
而在終端中拷貝和黏貼,需要用“Ctrl+Shift+C”和“Ctrl+Shift+V”來執行。
kill命令:結束一個程式
Ctrl + C這個組合鍵只能作用於當前終端中正在執行的程式,而Linux中,很多程式是你看不到的,在後臺執行。
這時候就需要請出kill命令了。
kill是英語《殺死》的意思,雖然有點“小暴力”,但是這個命令卻很有用。
kill命令後接需要結束的程式號,也就是之前我們看到過的PID。是一個數字,我們可以通過ps命令或top命令來獲知程式的PID。
例如:
kill 8461複製程式碼
我們也可以同時用kill來結束好幾個程式,只要用空格隔開它們的PID:
kill 8461 8561 1706複製程式碼
有時候,kill命令雖然作用於一個程式,但是它不終止,卡住了(因為kill命令會很友善地結束程式)。那怎麼辦呢?有沒有比較簡單粗暴的方式呢?
是有的,我們可以用kill -9來立即強制結束程式。比如:
kill -9 7291複製程式碼
立即結束PID是7291的程式,非常“野蠻粗暴”。
killall:結束多個程式
記得我們之前提過,同一個程式執行時可能啟動多個程式。如果你想一下子結束所有這些程式,怎麼做呢?
當然,你可以用kill + PID的方式一個個地結束這些程式,但是我們有一個更快捷的命令:killall。
all是英語《全部》的意思,所以killall命令就是用於結束全部要結束的程式。
不同於kill命令,killall命令後接程式名,而不是PID(程式號)。
假設現在我開了好幾個圖形終端,在每一箇中我都執行find命令進行檔案的查詢。
這樣,我用 ps -u oscar | grep find就可以搜尋出好多個find的程式。
如果我要結束所有這些find程式,可以這麼做:
killall find複製程式碼
halt命令和reboot命令:停止和重啟系統
既然我們剛學瞭如何用kill命令來結束程式,那麼現在我們該來學習一下如何關閉和重啟整個Linux系統了吧。
雖然你肯定已經知道如何用圖形介面的操作方式來關閉和重啟系統了。但是用命令列,也許你還不知道怎麼做吧。
halt:關閉系統
需要以root身份才能關閉系統,所以我們可以這麼做:
sudo halt複製程式碼
reboot:重啟系統
同樣地,需要以root身份才能重啟系統,我們可以這麼做:
sudo reboot複製程式碼
實際上,halt和reboot這兩個命令都呼叫了Linux的另一個命令:shutdown
大家可以閱讀shutdown命令的手冊,也可以自行去網上搜尋一下如何用shutdown命令來實現定時關機或重啟(有很多教程)。
算是留給大家的小作業了。
其實還有一個命令:poweroff也可以用於關機,而且非常有效率。
poweroff複製程式碼
總結
Linux是多工多使用者的作業系統。
w命令會顯示當下有哪些使用者在系統上登入著,在做什麼,還可以獲知系統時間,持續執行時間,負載等資訊。
ps命令顯示程式的快照,是靜態的。top命令是動態可互動的,會實時更新頁面。
組合鍵Ctrl + C結束當前終端中正在執行的程式。
kill命令用於結束程式,後接程式的PID(一個數字)。如果kill這個比較友好的結束命令不起作用,程式依舊卡住,那麼我們可以使用kill -9來強制結束程式。
halt命令關閉系統,reboot命令重啟系統。
第三部分第四課預告
今天的課就到這裡,一起加油吧!
下一課我們學習:Linux探索之旅 | 第三部分第四課:後臺執行及合併多個終端
微信公眾號「程式設計師聯盟」ProgrammerLeague
我是謝恩銘,在巴黎奮鬥的軟體工程師。
我的簡介
我的經歷
熱愛生活,喜歡游泳,略懂烹飪。
人生格言:“向著標杆直跑”