歡迎您光臨本站 註冊首頁

Linux循序漸進(13)

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0

  第十二課 進程查看




本節中要介紹的不只是進程查看方面的內容,由於Linux是個多用戶系統,有時候也要了解其他用戶現在在幹什麼,在本節中還將接觸多用戶方面的內容.同時Linux是一個多進程系統,經常需要對這些進程進行一些調配和管理;而要進行管理,就要知道現在的進程情況:究竟有哪些進程?進程情況如何?等等.需要進程查看方面的工作.

who命令

該命令主要用於查看當前在線上的用戶情況.這個命令非常有用.如果用戶想和其他用戶建立即時通訊,比如使用talk命令,那麼要確定的就是該用戶確實在線上,不然talk進程就無法建立起來.又如,系統管理員希望監視每個登錄的用戶此時此刻的所作所為,也要使用who命令.

who命令的常用語法格式如下:

who [imqsuwHT] [--count] [--idle] [--heading] [--help] [--message] [--mesg] [--version] [--writable] [file] [am i]

所有的選項都是可選的,也就是說可以單獨使用who命令.不使用任何選項時,who命令將顯示以下三項內容:

login name:登錄用戶名;

terminal line:使用終端設備;

login time:登錄到系統的時間.

如果給出的是兩個非選項參數,那麼who命令將只顯示運行who程序的用戶名、登錄終端和登錄時間.通常這兩個參數是「am i」,即該命令格式為:「who am i」.

下面對who命令的常用參數進行說明.

-m 和「who am i」的作用一樣,顯示運行該程序的用戶名.

-q,--count 只顯示用戶的登錄帳號和登錄用戶的數量,該選項優先順序高於其他任何選項.

-s 忽略.主要是用於和其他版本的who命令兼容.

-i,-u,--idle 在登錄時間後面顯示該用戶一次對系統進行操作至今的時間,也就是常說的「發獃」時間.其中「.」符號代表該用戶在前1秒仍然處於活動狀態;「old」則表示該用戶空閑已經超過了24小時.



-H,--heading 顯示一行列標題.常用的標題如表4-2所示.

表4-2 who命令輸出常用標題

標 題
說 明

USER
用戶登錄帳號

LINE
用戶登錄使用終端

LOGIN-TIME
用戶登錄時間

IDLE
用戶空閑時間,即未進行操作的時間

PID
用戶登錄shell的進程ID

FROM
用戶網路地址


 

-w,-T--mesg,--message,--writable 和-s選項一樣,在登錄帳號後面顯示一個字元來表示用戶的信息狀態:

:允許寫信息;

-:不允許寫信息;

?:不能找到終端設備.

--help 在標準輸出上顯示幫助信息.

--version 在標準輸出上顯示版本信息.

下面介紹who命令的一些基本用法.

如果需要查看在系統上究竟有哪些用戶,可以直接使用who命令.

[例17] 查看登錄到系統的用戶情況

$ who

root tty1 Mar 17 13:49

foxy tty2 Mar 17 13:49

root tty3 Mar 17 13:49

bbs ttyp0 Mar 17 13:49 (river.net)

可以看到,現在系統一共有四個用戶.第一列是登錄用戶的帳號;第二列是登錄所使用的終端;第三列是登錄時間;第四列是用戶從什麼地方登錄的網路地址,這裡是域名.

一般來說,這樣就可以了解登錄用戶的大致情況了.但有時上面的顯示不是那麼直觀,沒有標題說明,不容易看懂,這時就需要使用-H選項了.

[例18] 查看登錄用戶的詳細情況,鍵入:

$ who -uH

顯示如下:

USER LINE LOGIN-TIME IDLE FROM

root tty1 Mar 17 13:49 .

foxy tty2 Mar 17 13:49 00:01

root tty3 Mar 17 13:49 00:01

bbs ttyp0 Mar 17 13:49 00:01 (river.net)

這樣一目了然.其中-u選項指定顯示用戶空閑時間,可以看到多了一項IDLE.第一個root用戶的IDLE項是一個「.」,這就說明該用戶在前1秒仍然是活動的,而其他用戶後面都有一個時間,稱為空閑時間.



來看看使用「who am i」格式命令的結果:

233.river.net!root tty1 Mar 17 13:49

可見只顯示出了運行該who命令的用戶情況,當然這時候不存在空閑時間.

who命令應用起來非常簡單,可以比較準確地掌握用戶的情況,使用非常廣泛.

w命令

該命令也用於顯示登錄到系統的用戶情況,但是與who不同的是,w命令功能更加強大,它不但可以顯示有誰登錄到系統,還可以顯示出這些用戶當前正在進行的工作,並且統計數據相對who命令來說更加詳細和科學,可以認為w命令就是who命令的一個增強版.

w命令的顯示項目按以下順序排列:當前時間,系統啟動到現在的時間,登錄用戶的數目,系統在最近1秒、5秒和15秒的平均負載.然後是每個用戶的各項數據,項目顯示順序如下:登錄帳號、終端名稱、遠程主機名、登錄時間、空閑時間、JCPU、PCPU、當前正在運行進程的命令行.

其中JCPU時間指的是和該終端(tty)連接的所有進程佔用的時間.這個時間裡並不包括過去的後台作業時間,但卻包括當前正在運行的後台作業所佔用的時間.而PCPU時間則是指當前進程(即在WHAT項中顯示的進程)所佔用的時間.下面介紹該命令的具體用法和參數.

語法格式如下:

w -[husfV] [user]

下面對參數進行說明:

-h 不顯示標題.

-u 當列出當前進程和CPU時間時忽略用戶名.這主要是用於執行su命令后的情況.

-s 使用短模式.不顯示登錄時間、JCPU和PCPU時間.

-f 切換顯示FROM項,也就是遠程主機名項.默認值是不顯示遠程主機名,當然系統管理員可以對源文件作一些修改是的顯示該項成為默認值.

-V 顯示版本信息.

User 只顯示指定用戶的相關情況.



[例19] 顯示當前登錄到系統的用戶的詳細情況

$ w

2:50pm up 2 min, 4 users, load average:0.22,0.16,0.06

USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT

root tty1 2:49pm 0:00s 0.56s 0.10s w

foxy tty2 2:49pm 1:09 0.42s 0.42s bash

root tty3 2:49pm 46.00s 0.67s 0.25s telnet bbs3

bbs ttyp0 river.net 2:49pm 45.00s 0.49s 0.49s bbs h river.net

ps命令

1. ps簡介

前面介紹的兩個命令都是用於查看當前系統用戶的情況,下面就來看看進程的情況,這也是本章的主題.要對進程進行監測和控制,必須要了解當前進程的情況,也就是需要查看當前進程,而ps命令就是最基本同時也是非常強大的進程查看命令.使用該命令可以確定有哪些進程正在運行和運行的狀態、進程是否結束、進程有沒有僵死、哪些進程佔用了過多的資源等等.總之大部分信息都是可以通過執行該命令得到的.

2. ps命令及其參數

ps命令最常用的還是用於監控後台進程的工作情況,後台進程是不和屏幕鍵盤這些標準輸入/輸出設備進行通信的,如果需要檢測其情況,便可以使用ps命令了.

該命令語法格式如下:

ps [選項]

下面對命令選項進行說明:

-e 顯示所有進程.

-f 全格式.

-h 不顯示標題.

-l 長格式.

-w 寬輸出.

a 顯示終端上的所有進程,包括其他用戶的進程.

r 只顯示正在運行的進程.

x 顯示沒有控制終端的進程.

O[ |-] k1 [,[ |-] k2 [,…]] 根據SHORT KEYS、k1、k2中快捷鍵指定的多級排序順序顯示進程列表.對於ps的不同格式都存在著默認的順序指定.這些默認順序可以被用戶的指定所覆蓋.其中「 」字元是可選的,「-」字元是倒轉指定鍵的方向.



pids 只列出指定進程的情況.各進程ID之間使用逗號分隔.該進程列表必須在命令行參數的一個選項後面緊接著給出,中間不能插入空格.比如:ps -f1,4,5.

以下介紹長命令行選項,這些選項都使用「--」開頭:

--sort X[ |-] key [,[ |-] key [,…]] 從SORT KEYS段中選一個多字母鍵.「 」字元是可選的,默認的方向就是按數字升序或者詞典順序.比如: ps -jax -sort=uid,-ppid, pid.

--help 顯示幫助信息.

--version 顯示該命令的版本信息.

在前面的選項說明中提到了排序鍵,接下來對排序鍵作進一步說明.需要注意的是排序中使用的值是ps使用的內部值,並非僅用於某些輸出格式的偽值.排序鍵列表見表4-3.

表4-3 排序鍵列表

短格式
長格式
說 明

c
cmd
可執行的簡單名稱

C
cmdline
完整命令行

f
flags
長模式標誌

g
pgrp
進程的組ID

G
tpgid
控制tty進程組ID

j
cutime
累計用戶時間

J
cstime
累計系統時間

k
utime
用戶時間

K
stime
系統時間

m
min_flt
次要頁錯誤的數量

M
maj_flt
主要頁錯誤的數量

n
cmin_flt
累計次要頁錯誤

N
cmaj_flt
累計主要頁錯誤

o
session
對話ID

p
pid
進程ID

P
ppid
父進程ID

r
rss
駐留大小

R
resident
駐留頁

s
size
內存大小(千位元組)

S
share
共享頁的數量

t
tty
tty次要設備號

T
start_time
進程啟動的時間

U
uid
UID

u
user
用戶名



v
vsize
總的虛擬內存數量(位元組)

y
priority
內核調度優先順序


3. 常用ps命令參數

前面兩節介紹的參數可能讓讀者覺得有些可怕,實際上這是一個非常容易使用的命令,一般的用戶只需掌握一些最常用的命令參數就可以了.

最常用的三個參數是u、a、x,下面將通過例子來說明其具體用法.

[例20] 以root身份登錄系統,查看當前進程狀況

$ ps

PID TTY TIME COMMAND

5800 ttyp0 00:00:00 bash

5835 ttyp0 00:00:00 ps

可以看到,顯示的項目共分為四項,依次為PID(進程ID)、TTY(終端名稱)、TIME(進程執行時間)、COMMAND(該進程的命令行輸入).

可以使用u選項來查看進程所有者及其他一些詳細信息,如下所示:

$ ps u

USER PID %CPU %MEM USZ RSS TTY STAT START TIME COMMAND

test 5800 0.0 0.4 1892 1040 ttyp0 S Nov27 0:00 -bash

test 5836 0.0 0.3 2528 856 ttyp0 R Nov27 0:00 ps u

在bash進程前面有條橫線,意味著該進程便是用戶的登錄shell,對於一個登錄用戶來說帶短橫線的進程只有一個.還可以看到%CPU、%MEM兩個選項,前者指該進程佔用的CPU時間和總時間的百分比;後者指該進程佔用的內存和總內存的百分比.

在這種情況下看到了所有控制終端的進程;但是對於其他那些沒有控制終端的進程還是沒有觀察到,這時就需要使用x選項.使用x選項可以觀察到所有的進程情況.

[例21] 下面是使用x選項的例子:

$ ps x

PID TTY STAT TIME COMMAND

5800 ttyp0 S 0:00 -bash

5813 ttyp1 S 0:00 -bash

5921 ttyp0 S 0:00 man ps

5922 ttyp0 S 0:00 sh -c /usr/bin/gunzip -c /var/catman/cat1/ps.1.gz | /

5923 ttyp0 S 0:00 /usr/bin/gunzip -c /var/catman/cat1/ps.1.gz

5924 ttyp0 S 0:00 /usr/bin/less -is



5941 ttyp1 R 0:00 ps x

可以發現突然一下子就多出了那麼多的進程.這些多出來的進程就是沒有控制終端的進程.

前面看到的所有進程都是test用戶自己的.其實還有許多其他用戶在使用著系統,自然也就對應著其他的很多進程.如果想對這些進程有所了解,可以使用a選項來查看當前系統所有用戶的所有進程.經常使用的是aux組合選項,這可以顯示最詳細的進程情況.

 

[例22]

$ ps aux

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

root 1 0.0 0.0 1136 64 ? S Nov25 0:02 init [3]

root 2 0.0 0.0 0 0 ? SW Nov25 0:00 [kflushd]

root 3 0.0 0.0 0 0 ? SW Nov25 0:03 [kupdate]

root 4 0.0 0.0 0 0 ? SW Nov25 0:00 [kpiod]

root 5 0.0 0.0 0 0 ? SW Nov25 0:00 [kswapd]

root 163 0.0 0.1 1628 332 ? S Nov25 0:02 sshd

root 173 0.0 0.0 1324 200 ? S Nov25 0:00 syslogd

root 181 0.0 0.0 1420 0 ? SW Nov25 0:00 [klogd]

daemon 191 0.0 0.1 1160 312 ? S Nov25 0:00 /usr/sbin/atd

root 201 0.0 0.1 1348 492 ? S Nov25 0:00 crond

root 212 0.0 0.0 1292 68 ? S Nov25 0:00 inetd

……

在顯示的最前面是其他用戶的進程情況,可以看到有root、daemon等用戶以及他們所啟動的進程.

在上面的例子中,介紹了ps命令最常見的一些選項和選項組合,用戶可以根據自己的需要選用.

top命令

top命令和ps命令的基本作用是相同的,顯示系統當前的進程和其他狀況;但是top是一個動態顯示過程,即可以通過用戶按鍵來不斷刷新當前狀態.如果在前台執行該命令,它將獨佔前台,直到用戶終止該程序為止.

比較準確的說,top命令提供了實時的對系統處理器的狀態監視.它將顯示系統中CPU最「敏感」的任務列表.該命令可以按CPU使用.內存使用和執行時間對任務進行排序;該命令的很多特性都可以通過互動式命令或者在個人定製文件中進行設定.在後面的介紹中將把命令參數和交互命令分開講述.



下面是該命令的語法格式:

top [-] [d delay] [q] [c] [s] [S] [i]

d 指定每兩次屏幕信息刷新之間的時間間隔.當然用戶可以使用s交互命令來改變之.

q 該選項將使top沒有任何延遲的進行刷新.如果調用程序有超級用戶許可權,那麼top將以儘可能高的優先順序運行.

S 指定累計模式.

s 使top命令在安全模式中運行.這將去除交互命令所帶來的潛在危險.

i 使top不顯示任何閑置或者僵死進程.

c 顯示整個命令行而不只是顯示命令名

top命令顯示的項目很多,默認值是每5秒更新一次,當然這是可以設置的.顯示的各項目為:

uptime 該項顯示的是系統啟動時間、已經運行的時間和三個平均負載值(最近1秒,5秒,15秒的負載值).

processes 自最近一次刷新以來的運行進程總數.當然這些進程被分為正在運行的,休眠的,停止的等很多種類.進程和狀態顯示可以通過交互命令t來實現.

CPU states 顯示用戶模式,系統模式,優先順序進程(只有優先順序為負的列入考慮)和閑置等各種情況所佔用CPU時間的百分比.優先順序進程所消耗的時間也被列入到用戶和系統的時間中,總的百分比將大於100%.

Mem 內存使用情況統計,其中包括總的可用內存,空閑內存,已用內存,共享內存和緩存所佔內存的情況.

Swap 交換空間統計,其中包括總的交換空間,可用交換空間,已用交換空間.

PID 每個進程的ID.

PPID 每個進程的父進程ID.

UID 每個進程所有者的UID .

USER 每個進程所有者的用戶名.

PRI 每個進程的優先順序別.

NI 該進程的優先順序值.

SIZE 該進程的代碼大小加上數據大小再加上堆棧空間大小的總數.單位是KB.



TSIZE 該進程的代碼大小.對於內核進程這是一個很奇怪的值.

DSIZE 數據和堆棧的大小.

TRS 文本駐留大小.

D 被標記為「不幹凈」的頁項目.

LIB 使用的庫頁的大小.對於ELF進程沒有作用.

RSS 該進程佔用的物理內存的總數量,單位是KB.

SHARE 該進程使用共享內存的數量.

STAT 該進程的狀態.其中S代表休眠狀態;D代表不可中斷的休眠狀態;R代表運行狀態;Z代表僵死狀態;T代錶停止或跟蹤狀態.

TIME 該進程自啟動以來所佔用的總CPU時間.如果進入的是累計模式,那麼該時間還包括這個進程子進程所佔用的時間.且標題會變成CTIME.

%CPU 該進程自最近一次刷新以來所佔用的CPU時間和總時間的百分比.

%MEM 該進程佔用的物理內存佔總內存的百分比.

COMMAND 該進程的命令名稱,如果一行顯示不下,則會進行截取.內存中的進程會有一個完整的命令行.

下面介紹在top命令執行過程中可以使用的一些交互命令.從使用角度來看,熟練的掌握這些命令比掌握選項還重要一些.這些命令都是單字母的,如果在命令行選項中使用了s選項,則可能其中一些命令會被屏蔽掉.

<空格> 立即刷新顯示.

Ctrl L 擦除並且重寫屏幕.

h或者? 顯示幫助畫面,給出一些簡短的命令總結說明.

k 終止一個進程.系統將提示用戶輸入需要終止的進程PID,以及需要發送給該進程什麼樣的信號.一般的終止進程可以使用15信號;如果不能正常結束那就使用信號9強制結束該進程.默認值是信號15.在安全模式中此命令被屏蔽.

i 忽略閑置和僵死進程.這是一個開關式命令.

q 退出程序.

r 重新安排一個進程的優先順序別.系統提示用戶輸入需要改變的進程PID以及需要設置的進程優先順序值.輸入一個正值將使優先順序降低,反之則可以使該進程擁有更高的優先權.默認值是10.



S 切換到累計模式.

s 改變兩次刷新之間的延遲時間.系統將提示用戶輸入新的時間,單位為s.如果有小數,就換算成m s.輸入0值則系統將不斷刷新,默認值是5 s.需要注意的是如果設置太小的時間,很可能會引起不斷刷新,從而根本來不及看清顯示的情況,系統負載也會大大增加.

f或者F 從當前顯示中添加或者刪除項目.

o或者O 改變顯示項目的順序.

l 切換顯示平均負載和啟動時間信息.

m 切換顯示內存信息.

t 切換顯示進程和CPU狀態信息.

c 切換顯示命令名稱和完整命令行.

M 根據駐留內存大小進行排序.

P 根據CPU使用百分比大小進行排序.

T 根據時間/累計時間進行排序.

W 將當前設置寫入~/.toprc文件中.這是寫top配置文件的推薦方法.

從上面的介紹中可以看到,top命令是一個功能十分強大的監控系統的工具,尤其對於系統管理員而言更是如此.一般的用戶可能會覺得ps命令其實就夠用了,但是top命令的強勁功能確實提供了不少方便.下面來看看實際使用的情況.

 

[例23] 鍵入top命令查看系統狀況

$ top

1:55pm up 7 min, 4 user, load average:0.07,0.09,0.06

29 processes:28 sleeping, 1 running, 0 zombie, 0 stopped

CPU states: 4.5% user, 3.6% system, 0.0% nice, 91.9% idle

Mem: 38916K av, 18564K used, 20352K free, 11660K shrd, 1220K buff

Swap: 33228K av, 0K used, 33228K free, 11820K cached

PID USER PRI NI SIZE RSS SHARE STAT LIB %CPU %MEM TIME COMMAND

363 root 14 0 708 708 552 R 0 8.1 1.8 0:00 top

1 root 0 0 404 404 344 S 0 0.0 1.0 0:03 init

2 root 0 0 0 0 0 SW 0 0.0 0.0 0:00 kflushd

3 root -12 -12 0 0 0 SW< 0 0.0 0.0 0:00 kswapd

4 root 0 0 0 0 0 SW 0 0.0 0.0 0:00 md_thread



5 root 0 0 0 0 0 SW 0 0.0 0.0 0:00 md_thread

312 root 1 0 636 636 488 S 0 0.0 1.6 0:00 telnet

285 root 6 0 1140 1140 804 S 0 0.0 2.9 0.00 bash

286 root 0 0 1048 1048 792 S 0 0.0 2.6 0.00 bash

25 root 0 0 364 364 312 S 0 0.0 0.9 0.00 kerneld

153 root 0 0 456 456 372 S 0 0.0 1.1 0.00 syslogd

160 root 0 0 552 552 344 S 0 0.0 1.4 0.00 klogd

169 daemon 0 0 416 416 340 S 0 0.0 1.0 0.00 atd

178 root 2 0 496 496 412 S 0 0.0 1.2 0.00 crond

187 bin 0 0 352 352 284 S 0 0.0 0.9 0.00 portmap

232 root 0 0 500 500 412 S 0 0.0 1.2 0.00 rpc.mountd

206 root 0 0 412 412 344 S 0 0.0 1.0 0.00 inetd

215 root 0 0 436 436 360 S 0 0.0 1.1 0.00 icmplog

 

 

第一行的項目依次為當前時間、系統啟動時間、當前系統登錄用戶數目、平均負載.第二行為進程情況,依次為進程總數、休眠進程數、運行進程數、僵死進程數、終止進程數.第三行為CPU狀態,依次為用戶佔用、系統佔用、優先進程佔用、閑置進程佔用.第四行為內存狀態,依次為平均可用內存、已用內存、空閑內存、共享內存、緩存使用內存.第五行為交換狀態,依次為平均可用交換容量、已用容量、閑置容量、高速緩存容量.然後下面就是和ps相仿的各進程情況列表了.

總的來說,top命令的功能強於ps,但需要長久佔用前台,用戶應該根據自己的情況來使用這個命令.

 



[火星人 ] Linux循序漸進(13)已經有498次圍觀

http://coctec.com/docs/linux/show-post-57605.html