十、
進程管理
進程就是運行中的程序,一個運行着的程序,可能有多個進程。 比如
LinuxSir.Org
所用的
WWW
服務器是
apache
服務器,當管理員啟動服務后,可能會有好多人來訪問,也就是說許多用戶來同時請
求
httpd
服務,
apache
服務器將會創建有多個
httpd
進程來對其進行服務。
1
、
進程分類
進程一般分為交互進程、批處理進程和守護進程三類。
值得一提的是守護進程總是活躍的,一般是后台運行,守護進程一般是由系統在開機時通過腳本自
動激活啟動或超級管理用戶
root
來啟動。比如在
Fedora
或
Redhat
中,我們可以定義
httpd
服務器的啟
動腳本的運行級別,此文件位於
/etc/init.d
目錄下,文件名是
httpd
,
/etc/init.d/httpd
就是
httpd
服務器
的守護程序,當把它的運行級別設置為
3
和
5
時,當系統啟動時,它會跟着啟動。
[root@localhost ~]# chkconfig --level 35 httpd on
由於守護進程是一直運行着的,所以它所處的狀態是等待請求處理任務。比如,我們是不是訪問
LinuxSir.Org
,
LinuxSir.Org
的
httpd
服務器都在運行,等待着用戶來訪問,也就是等待着任務處理。
2
、進程的屬性
進程
ID
(
PID)
:是唯一的數值,用來區分進程;
父進程和父進程的
ID
(
PPID)
;
啟動進程的用戶
ID
(
UID
)和所歸屬的組(
GID
);
進程狀態:狀態分為運行
R
、休眠
S
、僵屍
Z
;
進程執行的優先級;
進程所連接的終端名;
進程資源占用:比如占用資源大小(內存、
CPU
占用量);
3
、父進程和子進程
他們的關系是管理和被管理的關系,當父進程終止時,子進程也隨之而終止。但子進程終止,父進
程並不一定終止。比如
httpd
服務器運行時,我們可以殺掉其子進程,父進程並不會因為子進程的終止
而終止。
在進程管理中,當我們發現占用資源過多,或無法控制的進程時,應該殺死它,以保護系統的穩定
安全運行
4
、進程管理命令
4.1
、
ps
ps
為我們提供了進程的一次性的查看,它所提供的查看結果並不動態連續的;如果想對進程時間監控,
應該用
top
工具。
4.1.1
、
ps
的參數說明:
ps
提供了很多的選項參數,常用的有以下幾個;
l
長格式輸出;
u
按用戶名和啟動時間的順序來顯示進程;
j
用任務格式來顯示進程;
f
用樹形格式來顯示進程;
a
顯示所有用戶的所有進程(包括其它用戶);
x
顯示無控制終端的進程;
r
顯示運行中的進程;
ww
避免詳細參數被截斷;
我們常用的選項是組合是
aux
或
lax
,還有參數
f
的應用;
ps aux
或
lax
輸出的解釋;
USER
表示啟動進程用戶。
PID
表示進程標志號。
%CPU
表示運行該進程占用
CPU
的時間與該進
程總的運行時間的比例。
%MEM
表示該進程占用內存和總內存的比例。
VSZ
表示占用的虛擬內存大
小,以
KB
為單位。
RSS
為進程占用的物理內存值,以
KB
為單位。
TTY
表示該進程建立時所對應的
終端,
"?"
表示該進程不占用終端。
STAT
表示進程的運行狀態,包括以下幾種代碼:
D
,不可中斷的
睡眠;
R
,就緒(在可運行隊列中);
S
,睡眠;
T
,被跟蹤或停止;
Z
,終止(僵死)的進程,
Z
不
存在,但暫時無法消除;
W
,沒有足夠的內存分頁可分配;
<
高優先序的進程;
N
,低優先序的進程;
L
,有內存分頁分配並鎖在內存體內(實時系統或
I/O
)。
START
為進程開始時間。
TIME
為執行的時
間。
COMMAND
是對應的命令名。
4.1.2 ps
應用舉例
實例一:
ps aux
最常用
[root@localhost ~]# ps -aux |more
可以用
|
管道和
more
連接起來分頁查看;
[root@localhost ~]# ps aux > ps001.txt
[root@localhost ~]# more ps001.txt
這里是把所有進程顯示出來,並輸出到
ps001.txt
文件,然后再通過
more
來分頁查看;
實例二:和
grep
結合,提取指定程序的進程;
[root@localhost ~]# ps aux |grep httpd
root 4187 0.0 1.3 24236 10272 ? Ss 11:55 0:00 /usr/sbin/httpd
apache 4189 0.0 0.6 24368 4940 ? S 11:55 0:00 /usr/sbin/httpd
apache 4190 0.0 0.6 24368 4932 ? S 11:55 0:00 /usr/sbin/httpd
apache 4191 0.0 0.6 24368 4932 ? S 11:55 0:00 /usr/sbin/httpd
apache 4192 0.0 0.6 24368 4932 ? S 11:55 0:00 /usr/sbin/httpd
apache 4193 0.0 0.6 24368 4932 ? S 11:55 0:00 /usr/sbin/httpd
apache 4194 0.0 0.6 24368 4932 ? S 11:55 0:00 /usr/sbin/httpd
apache 4195 0.0 0.6 24368 4932 ? S 11:55 0:00 /usr/sbin/httpd
apache 4196 0.0 0.6 24368 4932 ? S 11:55 0:00 /usr/sbin/httpd
root 4480 0.0 0.0 5160 708 pts/3 R+ 12:20 0:00 grep httpd
實例二:父進和子進程的關系友好判斷的例子
[root@localhost ~]# ps auxf |grep httpd
root 4484 0.0 0.0 5160 704 pts/3 S+ 12:21 0:00 \_ grep
httpd
root 4187 0.0 1.3 24236 10272 ? Ss 11:55 0:00 /usr/sbin/httpd
apache 4189 0.0 0.6 24368 4940 ? S 11:55 0:00 \_ /usr/sbin/httpd
apache 4190 0.0 0.6 24368 4932 ? S 11:55 0:00 \_ /usr/sbin/httpd
apache 4191 0.0 0.6 24368 4932 ? S 11:55 0:00 \_ /usr/sbin/httpd
apache 4192 0.0 0.6 24368 4932 ? S 11:55 0:00 \_ /usr/sbin/httpd
apache 4193 0.0 0.6 24368 4932 ? S 11:55 0:00 \_ /usr/sbin/httpd
apache 4194 0.0 0.6 24368 4932 ? S 11:55 0:00 \_ /usr/sbin/httpd
apache 4195 0.0 0.6 24368 4932 ? S 11:55 0:00 \_ /usr/sbin/httpd
apache 4196 0.0 0.6 24368 4932 ? S 11:55 0:00 \_ /usr/sbin/httpd
這里用到了
f
參數;父與子關系一目了然;
例三:找出消耗內存最多的前
10
名進程
# ps -auxf | sort -nr -k 4 | head -10
例四:找出使用
CPU
最多的前
10
名進程
# ps -auxf | sort -nr -k 3 | head -10
4.2
、
pstree
功能:
pstree
命令列出當前的進程,以及它們的樹狀結構。
格式:
pstree [
選項
] [pid|user]
主要選項如下:
-a
:顯示執行程序的命令與完整參數。
-c
:取消同名程序,合並顯示。
-h
:對輸出結果進行處理,高亮顯示正在執行的程序。
-l
:長格式顯示。
-n
:以
PID
大小排序。
-p
:顯示
PID
。
-u
:顯示
UID
信息。
-G
:使用
VT100
終端編碼顯示。
-U
:使用
UTF-8
(
Unicode
)編碼顯示。
說明:使用
ps
命令得到的數據精確,但數據龐大,這一點對掌握系統整體概況來說是不容易的。
pstree
正好可以彌補這個缺憾。它能將當前的執行程序以樹狀結構顯示。
pstree
支持指定特定程序(
PID
)
或使用者(
USER
)作為顯示的起始。
應用實例如下。
進程啟動的時候可能會產生自己的一個子進程。運行
pstree
命令就可以很容易地看到這些信息。以超
級用戶權限運行
pstree
:
#
init-+-apmd
|-atd
|-bdflush
|-gconfd-2
|-gdm-binary---gdm-binary-+-X
| `-startkde-+-kwrapper
| `-ssh-agent
|-gpm
|-httpd---8*[httpd]
……
下略
命令對程序名稱相同的會自動合並,所有
"|-httpd---8*[httpd]"
即表示系統中有
8
個
httpd
進程產生的
子進程。
4.3
、
top
top
命令用來顯示系統當前的進程狀況。
格式:
top [
選項
]
主要選項如下。
d
:指定更新的間隔,以秒計算。
q
:沒有任何延遲的更新。如果使用者有超級用戶,則
top
命令將會以最高的優先序執行。
c
:顯示進程完整的路徑與名稱。
S
:累積模式,會將已完成或消失的子進程的
CPU
時間累積起來。
s
:安全模式。
i
:不顯示任何閑置(
Idle
)或無用(
Zombie
)的進程。
n
:顯示更新的次數,完成后將會退出
top
。
說明:
top
命令和
ps
命令的基本作用是相同的,都顯示系統當前的進程狀況。但是
top
是一個動態顯
示過程,即可以通過用戶按鍵來不斷刷新當前狀態。這里結合下圖來說明它給出的信息。
第一行表示的項目依次為當前時間、系統啟動時間、當前系統登錄用戶數目、平均負載。
第二行顯示的是
Tasks: 114 total
進程總數、
2 running
正在運行的進程數、
110 sleeping
睡眠的進程數、
0 stopped
停止的進程數、
2 zombie
僵屍進程數
第三行顯示的是目前
CPU
的使用情況,
Cpu(s): 0.3% us
用戶空間占用
CPU
百分比、
1.0% sy
內核空間
占用
CPU
百分比、
0.0% ni
用戶進程空間內改變過優先級的進程占用
CPU
百分比、
98.7% id
空
閑
CPU
百分比、
0.0% wa
等待輸入輸出的
CPU
時間百分比、
0.0% hi
、
0.0% si
第四行顯示物理內存的使用情況,
Mem: 191272k total
物理內存總量、
173656k used
使用的物理內存
總量、
17616k free
空閑內存總量、
22052k buffers
用作內核緩存的內存量
第五行顯示交換分區使用情況,
Swap: 192772k total
交換區總量、
0k used
使用的交換區總量、
192772k
free
空閑交換區總量、
123988k cached
緩沖的交換區總量、內存中的內容被換出到交換區,
而后又被換入到內存,但使用過的交換區尚未被覆蓋,該數值即為這些內容已存在於內存中的
交換區的大小。相應的內存再次被換出時可不必再對交換區寫入。
第六行顯示的項目最多,下面列出了詳細解釋。
PID
(
Process ID
):進程標志號,是非零正整數。
USER
:進程所有者的用戶名。
PR
:進程的優先級別。
NI
:進程的優先級別數值。
VIRT
:進程占用的虛擬內存值。
RES
:進程占用的物理內存值。
SHR
:進程
使用的共享內存值。
STAT
:進程的狀態,其中
S
表示休眠,
R
表示正在運行,
Z
表示僵死狀態,
N
表
示該進程優先值是負數。
%CPU
:該進程占用的
CPU
使用率。
%MEM
:該進程占用的物理內存和總內
存的百分比。
TIME
:該進程啟動后占用的總的
CPU
時間。
COMMAND
:進程啟動的啟動命令名稱,如
果這一行顯示不下,進程會有一個完整的命令行。
top
命令使用過程中,還可以使用一些交互的命令來完成其他參數的功能。這些命令是通過快捷鍵啟
動的。
<
空格
>
:立刻刷新。
A
分類顯示系統不同資源的使用大戶。有助於快速識別系統中資源消耗多的任務。
f
添加刪除所要顯示欄位
.
o
調整所要顯示欄位的順序
.
r
調整一個正在運行的進程
Nice
值
.
k
結束一個正在運行的進程
.
z
彩色
/
黑白顯示開關
P
:根據
CPU
使用大小進行排序。
T
:根據時間、累計時間排序。
q
:退出
top
命令。
m
:切換顯示內存信息。
t
:切換顯示進程和
CPU
狀態信息。
c
:切換顯示命令名稱和完整命令行。
M
:根據使用內存大小進行排序。
W
:將當前設置寫入~
/.toprc
文件中。這是寫
top
配置文件的推薦方法。
可以看到,
top
命令是一個功能十分強大的監控系統的工具,對於系統管理員而言尤其重要。但是,
它的缺點是會消耗很多系統資源。