1. 程式人生 > >Linux伺服器的程序檢視命令詳解

Linux伺服器的程序檢視命令詳解

Linux 伺服器正常啟動後,提供服務時會呼叫程式,佔用程序。這時候我們如何檢視系統中有哪些程序在被呼叫呢?我們可以通過以下命令來檢視。

一、ps 命令

ps 命令是最基本同時也是非常強大的程序檢視命令。使用該命令可以確定有哪些程序正在執行和它所執行的狀態、程序是否結束、程序有沒有僵死、哪些程序佔用了過多的資源等。總之大部分資訊都是可以通過執行該命令得到的。ps 命令最常用來監控後臺程序的工作情況,因為後臺程序是不和螢幕、鍵盤這些標準輸入/輸出裝置進行通訊的,所以如果需要檢測後臺情況,就需要使用 ps 命令了。它的格式如下所示:格式:ps 〔選項〕其主要選項如下。

-a:顯示系統中所有程序的資訊。

-e:顯示所有程序的資訊。

-f:顯示程序的所有資訊。

-l:以長格式顯示程序資訊。

-r:只顯示正在執行的程序。

-u:顯示面向使用者的格式(包括使用者名稱、CPU 及記憶體的使用情況等資訊)。

-x:顯示所有非控制終端上的程序資訊。

-p:顯示由程序 ID 指定的程序資訊。

-t:顯示指定終端上的程序資訊。

要對程序進行監測和控制,首先要了解當前程序的情況,當然也就需要檢視當前程序的狀態了。通過 ps 命令檢視程序,根據所顯示的資訊可以瞭解哪個程序正在執行、哪個程序被掛起了、程序已運行了多久、程序正在使用的資源、程序的相對優先順序,以及程序的標誌號(PID)。所有這些資訊對使用者都很有用,對於系統管理員來說尤為重要。使用 ps -aux 命令可以獲得終端上所有使用者的有關程序的所有資訊,這個也是我們平時用得最多的命令之一,如下所示:

Shell
123456789101112131415 [root@localhost~]# ps -aux | moreWarning:bad syntax,perhapsabogus'-'?See/usr/share/doc/procps-3.2.7/FAQUSER       PID%CPU%MEM    VSZ   RSS TTYSTAT START   TIMECOMMANDroot10.00.010348580?Ss   Jan230:07init[5]root20.00.000?S<Jan230:01[migration/0]root30.00.000?SN   Jan230:00[ksoftirqd/0]root40.00.000?S<Jan230:00[watchdog/0]root50.00.000?S<Jan230:01[migration/1]root60.00.000?SN   Jan230:00[ksoftirqd/1]root70.00.000?S<Jan230:00[watchdog/1]root80.00.000?S<Jan230:00[migration/2]root90.00.000?SN   Jan230:00[ksoftirqd/2]root100.00.000?S<Jan230:00[watchdog/2]root110.00.000?S<Jan230:00[migration/3]....

USER:表示啟動程序的使用者。

PID:表示程序標誌號。

%CPU:表示執行該程序佔用 CPU 的時間與該程序總的執行時間之比。

%MEM:表示該程序佔用記憶體與總記憶體之比。

VSZ:表示佔用的虛擬記憶體大小,以 KB 為單位。

RSS:為程序佔用的實體記憶體值,以 KB 為單位。

TTY:表示該程序建立時所對應的終端,“?”表示該程序不佔用終端。

STAT:表示程序的執行狀態。包括以下幾種程式碼:D,不可中斷的睡眠;R,就緒(在可執行佇列中);S,睡眠;T,被跟蹤或停止;Z,終止(僵死)的程序,這些程序不存在,但暫時無法消除;W,沒有足夠的記憶體分頁可分配;<,高優先順序的程序;N,低優先順序的程序;L,有記憶體分頁分配並鎖在記憶體體內(實時系統或 I/O)。

START:為程序開始時間。

TIME:為執行的時間。

COMMAND:是對應的命令名。

由於 ps 執行後結果太多了,所以我們一般會帶上 grep 引數來精確定位我們需要的程序號。例如,我們要檢視 Nginx 佔用的程序,可以用命令 ps -axugrep nginx,如下所示:

Shell
1234567891011 root@localhost~〕# ps -axu| grep -v grep| grep nginxWarning:bad syntax,perhapsabogus-?See/usr/share/doc/procps-3.2.7/FAQroot 4342 0.0 0.0 41096 896?Ss Mar16 0:00nginx:master process/usr/local/webserver/nginx/sbin/nginxwww 4343 0.0 0.6 6592026232?SMar16 0:05nginx:worker processwww 4344 0.0 0.6 6592026160?SMar16 0:02nginx:worker processwww 4345 0.0 0.6 6607626460?SMar16 0:03nginx:worker processwww 4346 0.0 0.6 6592026104?SMar16 0:03nginx:worker processwww 4347 0.0 0.6 6605226228?SMar16 0:04nginx:worker processwww 4348 0.0 0.6 6601226372?SMar16 0:04nginx:worker processwww 4349 0.0 0.6 6578826076?SMar16 0:03nginx:worker processwww 4350 0.0 0.6 6592026188?SMar16 0:06nginx:worker process

二、top 命令

top 命令可動態顯示伺服器的程序資訊。top 命令和 ps 命令的基本作用是相同的,都顯示系統當前程序的狀況。但 top 是一個動態顯示過程,即使用者可以通過按鍵來不斷重新整理當前狀態。此命令的使用舉例如下所示:

Shell
12345678910111213141516171819202122232425262728 top-11:22:52up90days,1:18,1user,load average:1.06,1.18,1.08Tasks:506total,1running,504sleeping,0stopped,1zombieCpu(s):0.9%us,0.2%sy,0.0%ni,98.3%id,0.0%wa,0.0%hi,0.6%si,0.0%stMem:8171912ktotal,6772308kused,1399604kfree,387668kbuffersSwap:16385256ktotal,52964kused,16332292kfree,2112540kcachedPID USER PRNI VIRT RES SHRS%CPU%MEM TIME+COMMAND17700root1903205m2.0g16mS9.325.91362:18java3772root2003878m1.1g9128S5.614.162:24.67java15019root150130041424804R0.70.00:00.58top4499root150000S0.30.010:25.90nfsd4503root150000S0.30.010:15.94nfsd14018daemon150515619481052S0.30.00:00.06httpd1root15010348580548S0.00.00:07.59init2root RT-5000S0.00.00:01.25migration/03root3419000S0.00.00:00.32ksoftirqd/04root RT-5000S0.00.00:00.00watchdog/05root RT-5000S0.00.00:01.26migration/16root3419000S0.00.00:00.00ksoftirqd/17root RT-5000S0.00.00:00.00watchdog/18root RT-5000S0.00.00:00.25migration/29root3419000S0.00.00:00.32ksoftirqd/210root RT-5000S0.00.00:00.00watchdog/211root RT-5000S0.00.00:00.23migration/312root3419000S0.00.00:00.00ksoftirqd/313root RT-5000S0.00.00:00.00watchdog/314root RT-5000S0.00.00:00.20migration/415root3419000S0.00.00:00.25ksoftirqd/4.....

第一行內容依次表示當前時間、系統啟動的時間、當前系統登入的使用者數、平均負載。第二行依次顯示的是所有啟動的、目前執行的、掛起(Sleeping)的和無用(Zombie)的程序。第三行顯示的是目前 CPU 的使用情況,包括系統佔用的比例、使用者使用比例、閒置(Idle)比例。第四行顯示實體記憶體的使用情況,包括總的可以使用的記憶體、已用記憶體、空閒記憶體、緩衝區佔用的記憶體。第五行顯示交換分割槽的使用情況,包括總的交換分割槽、使用的、空閒的和用於快取記憶體的交換分割槽。第六行顯示的內容最多,下面分別進行詳細解釋。

Shell
1234567891011121314 PID(Process ID):程序標誌號,是非零正整數。USER:程序所有者的使用者名稱。PR:程序的優先級別。NI:程序的優先級別數值。VIRT:程序佔用的虛擬記憶體值。RES:程序佔用的實體記憶體值。SHR:程序使用的共享記憶體值。STAT:程序的狀態,其中S表示休眠,R表示正在執行,Z表示僵死狀態,N表示該程序優先值是負數。%CPU:該程序佔用的CPU使用率。%MEM:該程序佔用的實體記憶體和總記憶體的百分比。TIME:該程序啟動後佔用的總CPU時間。COMMAND:程序啟動的啟動命令名稱,如果這一行顯示不下,在程序中會有一個完整的命令列。

在 top 命令使用過程中,還可以使用一些互動的命令來完成其他引數的功能。這些命令是通過快捷鍵啟動的,格式如下所示:<空格>:立刻重新整理其主要引數如下所示。

12345678 P:根據CPU使用的多少進行排序。T:根據時間、累計時間排序。q:退出top命令。m:切換顯示記憶體資訊。t:切換顯示程序和CPU狀態資訊。c:切換顯示命令名稱和完整命令列。M:根據使用記憶體的大小進行排序。W:將當前設定寫入~/.toprc檔案中,這是寫top配置檔案的推薦方法。

三、pgrep 命令

pgrep 命令的作用是查詢當前執行的程序,並列出匹配給定條件程序的 PID。所有的條件都必須匹配才會被列出。使用許可權為所有使用者。

以下是我在一臺 64 位 FreeBSD8.1 x86_64 的機器上以使用者名稱 andrewyu 檢視的 ngnix 的所有程序號。

Shell
12345678910 [root@loalhost~]#pgrep nginx283428332832283128302828282728262825

四、kill 命令

kill 命令的作用是終止一個程序。其格式如下:

  1. kill 〔-s signal |-p〕 〔-a〕pid…
  2. kill -l 〔 signal 〕

它的主要選項如下所示。

-s:指定傳送的訊號。

-p:模擬傳送訊號。

-l:指定訊號的名稱列表。

pid:要終止的程序的 ID 號。

signal:表示訊號。

kill 可將指定的資訊送至程式中。預設的資訊為 SIGTERM(15),可將指定程式終止。若仍無法終止該程式,則可以使用 SIGKILL(9)資訊嘗試強制刪除程式。kill 命令的工作原理是,向 Linux 系統的核心傳送一個系統操作訊號和某個程式的程序標誌號,然後系統核心就可以對程序標誌號指定的程序進行操作了。當需要中斷一個前臺程序的時候,通常使用 Ctrl+C 組合鍵;但是對於一個後臺程序來說,就不是一個組合鍵所能解決的了,這時就必須使用 kill 命令。另外,kill -9 可以強制殺掉程序,尤其適用於殭屍程序。

五、killall 命令

killall 命令的作用是通過程式的名字,直接殺死所有程序,這裡簡單介紹一下。如果要殺掉 nginx 的所有程序,要是用 kill 的話就要執行 9 次,但如果用 killall nginx 則能很輕鬆地一次性解決問題。另外,大家有興趣也可以瞭解一下 pkill 的用法,在伺服器裡用它來“踢人”還是很方便的,這個命令在工作中我們用得不多,大家稍微瞭解一下即可。

在 Linux 下,最強大的程序管理命令莫過於 ps 和 top 了,我們應該掌握它們的詳細語法,在工作中靈活地使用它們。

注:以上內容整理自《構建高可用的 Linux