始終不能明白進程的正確理解和定義。就說我自己的理解吧
進程是 CPU 調度的基本單位,對于 unix like 來說,當我們登錄取得 bash 時,系統(tǒng)會根據(jù)用戶的uid 和 gid 分配給我們一個進程,在當前 bash 下,這個進程就是所有進程的父進程,當我們執(zhí)行一些命令時,每個命令都由一個新的子進程來完成。
在單一終端下,可以同時進行多項工作,如:一邊復制數(shù)據(jù),一邊查詢文件。每一項工作都由獨立的子進程來完成,他們的父進程就是當前終端對應 bash 的那個進程。
對于終端來說分為前臺和后臺
前臺:你可以控制于執(zhí)行命令的那個環(huán)境(串行工作)
后臺:可以自行運行的工作,無法使用 ctrl+c 終端它(并行工作)
如果所有的工作都由前臺來做,那么必須等一個工作處理完成才能進行下一個工作,這樣做效率很低,因此我們可以把一些不需要人工交互的工作放到后臺,使多個工作可以共同執(zhí)行
說明:前臺和后臺是針對同一個終端來說,tty1環(huán)境是無法管理 tty2的
語法:jobs[-lrs]
選項與參數(shù):
-l:列出工作與命令串之外,同時列出 PID
-r:僅列出后臺 run 的工作
-s: 僅列出后臺 stop 的工作
舉例
[root@localhost tmp]# jobs -l
[1]- 9154 停止 vim newfile.txt
[2]+ 9368 停止 find / -print
[3] 9374 Running tar -jcpP -f /tmp/etc1.tar.bz2 /etc &
以上輸出的格式為:工作序號|順序 PID 狀態(tài) 命令
順序:分為(+,-,空白),+號代表最后一個被放到后臺的工作;-號代表倒數(shù)第二個被放到后臺的工作,倒數(shù)第三個及以后用空白
[root@localhost tmp]# tar -jcpP -f/tmp/etc.tar.bz2 /etc &
[2] 8985
其中【2】表示工作號,8985表示處理這個工作的子進程號
如果我們將壓縮信息顯示出來
[root@localhost tmp]# tar –jcpP -v -f/tmp/etc.tar.bz2 /etc &
雖然這個工作在后臺進行,但是輸出信息還是會在前臺輸出的,因此可以應用數(shù)據(jù)流重定向將輸出信息寫到文件
[root@localhost tmp]# vim newfile.txt
=>按下 ctrl+z
[1]+ Stopped vimnewfile.txt
語法:fg %工作序號
fg –
fg +
語法:fg %工作序號
舉例:
[root@localhost tmp]# jobs -l;bg %2;jobs -l
[1]- 9154 停止 vim newfile.txt
[2]+ 9729 停止 tar -jcpP -f /tmp/etc1.tar.bz2 /etc
[2]+ tar -jcpP -f /tmp/etc1.tar.bz2 /etc &
[1]+ 9154 停止 vim newfile.txt
[2]- 9729 Running tar -jcpP -f /tmp/etc1.tar.bz2 /etc &
語法:kill –signal %工作序號
Sighal:
1:重新讀取一次參數(shù)的配置文件
2:代表有 ctrl+c 同樣的操作
9:立刻強制刪除一個工作
15.以正常方式終止工作
說明:unix like 中的信號64個,比較復雜以后在整體學習
舉例:
[root@localhost tmp]# jobs -l;kill -9 %1; jobs -l
[1]+ 已殺死 tar -jcpP -f /tmp/etc1.tar.bz2 /etc
靜態(tài)進程查看(ps)
語法:
ps aux|ps -lA 查看系統(tǒng)所有進程數(shù)據(jù)
ps –l 查看自己相關進程
ps –axjf 查看進程樹
舉例:
[root@localhost ~]# su -l tkf
[tkf@localhost tmp]$ tar -cjPp -f ./home.bz2 /home
[1]+ Stopped tar -cjPp -f ./home.bz2 /home
查看 ps -l
[tkf@localhost tmp]$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 500 10894 10893 0 75 0 - 1224 wait pts/1 00:00:00 bash
0 T 500 10951 10894 0 78 0 - 1224 finish pts/1 00:00:00 tar
0 T 500 10952 10951 0 78 0 - 2289 finish pts/1 00:00:01 bzip2
查看 ps -lA
[tkf@localhost tmp]$ ps –lA
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 0 75 0 - 544 stext ? 00:00:00 init
0 R 0 10691 1 0 75 0 - 20262 stext ? 00:00:01 gnome-terminal
4 S 0 10694 10691 0 77 0 - 649 stext ? 00:00:00 gnome-pty-help
0 S 0 10695 10691 0 76 0 - 1253 wait pts/1 00:00:00 bash
4 S 0 10893 10695 0 78 0 - 1319 wait pts/1 00:00:00 su
4 S 500 10894 10893 0 75 0 - 1224 wait pts/1 00:00:00 bash
0 T 500 10951 10894 0 78 0 - 1224 finish pts/1 00:00:00 tar
0 T 500 10952 10951 0 78 0 - 2289 finish pts/1 00:00:01 bzip2
處理 Init 程序的進程為所有進程的父進程 tar 命令內部會調用 bzip2命令因此產(chǎn)生10952進程,且bzip2進程的父進程就是 tar 進程
l F:代表這個程序旗標 (process flags),說明這個程序的總結權限,常見號碼有:
若為 4 表示此程序的權限為 root ;
若為 1 則表示此子程序僅進行復制(fork)而沒有實際運行(exec)。
l S:代表這個程序的狀態(tài) (STAT),主要的狀態(tài)有:
R (Running):該程序正在運行中;
S (Sleep):該程序目前正在睡眠狀態(tài)(idle),但可以被喚醒(signal)。
D :不可被喚醒的睡眠狀態(tài),通常這支程序可能在等待 I/O 的情況(ex>列印)
T :停止狀態(tài)(stop),可能是在工作控制(背景暫停)或除錯 (traced) 狀態(tài);
Z (Zombie):僵尸狀態(tài),程序已經(jīng)終止但卻無法被移除至內存外。
l UID/PID/PPID:代表[此程序被該 UID 所擁有/程序的 PID 號碼/此程序的父程序 PID 號碼]
l C:代表 CPU 使用率,單位為百分比;
l PRI/NI:Priority/Nice 的縮寫,代表此程序被 CPU 所運行的優(yōu)先順序,數(shù)值越小代表該程序越快被 CPU 運行。
l ADDR/SZ/WCHAN:都與內存有關,ADDR 是 kernel function,指出該程序在內存的哪個部分,如果是個 running 的程序,一般就會顯示[- ] / SZ 代表此程序用掉多少內存 / WCHAN 表示目前程序是否運行中,同樣的,若為 - 表示正在運行中。
l TTY:登陸者的終端機位置,若為遠程登陸則使用動態(tài)終端介面 (pts/n);
l TIME:使用掉的 CPU 時間,注意,是此程序實際花費 CPU 運行的時間,而不是系統(tǒng)時間;
l CMD:簡單描述命令
查看 ps aux
[tkf@localhost tmp]$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 2176 640 ? Ss 08:50 0:00 init [5]
root 10691 0.1 0.8 81336 17104 ? Sl 15:03 0:04 gnome-terminal
root 10694 0.0 0.0 2596 676 ? S 15:03 0:00 gnome-pty-helper
root 10695 0.0 0.0 5012 1476 pts/1 Ss 15:03 0:00 bash
root 10893 0.0 0.0 5276 1312 pts/1 S 15:16 0:00 su -l tkf
tkf 10894 0.0 0.0 4896 1444 pts/1 S 15:16 0:00 -bash
tkf 10951 0.0 0.0 4896 992 pts/1 T 15:18 0:00 tar -cjPp -f ./home.bz2 /home
tkf 10952 0.0 0.3 9156 7792 pts/1 T 15:18 0:01 bzip2
USER:該 process 屬於那個使用者帳號的?
PID :該 process 的程序識別碼。
%CPU:該 process 使用掉的 CPU 資源百分比;
%MEM:該 process 所占用的實體內存百分比;
VSZ :該 process 使用掉的虛擬內存量 (Kbytes)
RSS :該 process 占用的固定的內存量 (Kbytes)
TTY :該 process 是在那個終端機上面運行,若與終端機無關則顯示 ?,另外, tty1-tty6 是本機上面的登陸者程序,若為 pts/0 等等的,則表示為由網(wǎng)絡連接進主機的程序。
STAT:該程序目前的狀態(tài),狀態(tài)顯示與 ps -l 的 S 旗標相同 (R/S/T/Z)
START:該 process 被觸發(fā)啟動的時間;
TIME :該 process 實際使用 CPU 運行的時間。
COMMAND:詳細描述命令
查看 ps axjf
[tkf@localhost tmp]$ ps axjf
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
1 10691 4628 4628 ? -1 Sl 0 0:06 gnome-terminal
10691 10694 4628 4628 ? -1 S 0 0:00 \_ gnome-pty-helper
10691 10695 10695 10695 pts/1 11743 Ss 0 0:00 \_ bash
10695 10893 10893 10695 pts/1 11743 S 0 0:00 \_ su -l tkf
10893 10894 10894 10695 pts/1 11743 S 500 0:00 \_ -bash
10894 10951 10951 10695 pts/1 11743 T 500 0:00 \_ tar -cjPp -f ./home.bz2 /home
10951 10952 10951 10695 pts/1 11743 T 500 0:01 | \_ bzip2
語法:top[-d 數(shù)字] [-bn 數(shù)字] [-p pid]
選項與參數(shù)
-d:動態(tài)刷新時間間隔
-b:以批次方式執(zhí)行,與-n 連用
-n:執(zhí)行次數(shù)
-p:查看單個進程信息
在top 執(zhí)行過程中可以使用的命令
?:顯示幫助文檔
P:以 CPU 使用資源排序
M: 以 mem 使用資源排序
N: 以 PID 排序
T: 以 TIME+排序
k:給某個 PID 一個信號
r:給某個 PID 設置新的 Ni 值
q:離開
Z|z:設置|取消顏色
B|b:設置|取消關鍵字加粗
W:將設置信息寫入配置文件
n:顯示進程數(shù)量
c:顯示完整的 command
u:設置查看某個 USER 的進程
舉例:
[tkf@localhost ~]$ top
top - 10:08:12 up 55 min, 2 users, load average: 0.01, 0.01, 0.00
Tasks: 162 total, 1 running, 160 sleeping, 0 stopped, 1 zombie
Cpu(s): 1.5%us, 0.7%sy, 0.0%ni, 97.7%id, 0.0%wa, 0.2%hi, 0.0%si, 0.0
Mem: 2074908k total, 640268k used, 1434640k free, 41856k buffers
Swap: 1020088k total, 0k used, 1020088k free, 387260k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4784 root 15 0 64580 17m 10m S 5.4 0.9 0:06.63 gnome-terminal
4502 root 16 0 148m 11m 5964 S 0.6 0.6 0:12.18 Xorg
特殊字段說明
us 用戶空間占用 CPU 百分比
sy 內核空間占用 CPU 百分比
ni 用戶進程空間內改變過優(yōu)先級的進程占用 CPU 百分比
id 空閑 CPU 百分比
wa 等待輸入輸出的 CPU 時間百分比
hi 硬件中斷
si 軟件中斷
st: 實時
USER:該 process 所屬的使用者;
PR :Priority 的簡寫,程序的優(yōu)先運行順序,越小越早被運行;
NI :Nice 的簡寫,與 Priority 有關,也是越小越早被運行;
%CPU:CPU 的使用率;
%MEM:內存的使用率;
TIME+:CPU 使用時間的累加;
語法:pstree[-A|-U] [-up]
選項與參數(shù)
-A :各程序樹之間的連接以 ASCII 字節(jié)來連接;
-U :各程序樹之間的連接以 unicode 的字節(jié)來連接。在某些終端介面下可能會有錯誤;
-p :并同時列出每個 process 的 PID;
-u :并同時列出每個 process 的所屬帳號名稱。
舉例
[tkf@localhost ~]$ pstree -Apu
init(1)-+-/usr/bin/sealer(4774)
|-acpid(3891)
|-atd(4227)
|-auditd(3599)-+-audispd(3601)---{audispd}(3602)
| `-{auditd}(3600)
|-automount(3994)-+-{automount}(3995)
| |-{automount}(3996)
| |-{automount}(3999)
| `-{automount}(4002)
進程的管理就是給進程發(fā)送一個信號,告訴進程做什么事情
語法:kill –signal PID
killall [-iIe] –signal 服務名稱
說明 使用 kill 需要知道 PID,killall 根據(jù)服務發(fā)送信號
舉例1:給 bash 進程發(fā)送信號1
[root@localhost ~]# kill -1 $(ps aux |awk '{print $11 "" $2}'|grep '^bash'|awk '{print $2}')
舉例2:給 bash 這個服務對應的進程發(fā)送信號1
[root@localhost ~]# killall -i -1 bash
Kill bash(10202) ? (y/N)
進程的優(yōu)先級相關的只要是 PRI 與 NI 這兩個值, 數(shù)值越小優(yōu)先級越高,PRI 是系統(tǒng)內核設置的,用戶無法設置,用戶只能是指 NI 值來改變進程的優(yōu)先級
進程的優(yōu)先級=PRI+NI
在執(zhí)行命令時給予新的 NI 值:
語法:nice –n 數(shù)值 命令
數(shù)值的范圍從-20~19
設置以及啟動的進程
語法:renice 數(shù)值 PID
舉例:
[root@localhost ~]# nice -n 4 vim &
[1] 11467
[root@localhost ~]# ps -l|grep 'vim'
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 T 0 11467 10202 0 81 4 - 2525 finish pts/1 00:00:00 vim
[root@localhost ~]# renice -6 $(ps -l|grep 'vim'|awk '{print $4}')
11467: old priority 4, new priority -6
[root@localhost ~]# ps -l|grep 'vim'
0 T 0 11467 10202 0 71 -6 - 2525 finish pts/1 00:00:00 vim
我們經(jīng)常會遇到這種情況,要刪除某個文件或卸載某個文件系統(tǒng),提示我們正在使用,無法被刪除,此時我們就需要找到哪些進程正在使用它們,“殺死“這些進程后我們才能刪除這些文件
查詢文件被哪個進程使用(fuser)
語法:fuser[-umv] [-ki -signal] file/dir
選項與參數(shù):
-u:列出 user
-m:會查詢后面文件所在的文件系統(tǒng)
-v:列出詳細命令
-k:找出使用該文件 PID 并試圖發(fā)送 SIGKILL 這個信號給這個進程
-i:與-k 連用,發(fā)送信號之前詢問用戶
舉例
[root@localhost tmp]# tar -jtv -f ./etc.tar.bz2 > ./newfile.txt
= >按下 ctrl+z 工作在后臺暫停
[1]+ Stopped tar -jtv -f ./etc.tar.bz2 > ./newfile.txt
[root@localhost tmp]# fuser -uv ./etc.tar.bz2
USER PID ACCESS COMMAND
./etc.tar.bz2: root 11822 f.... (root)bzip2
= >這個文件正在被11822這個進程所使用
查詢進程正在使用的文件(lsof)
語法:lsof [-aUu][+d]
選項與參數(shù):
-a :多項數(shù)據(jù)需要同時成立才顯示出結果時
-U :僅列出 Unixlike 系統(tǒng)的 socket 文件類型;
-u :后面接 username,列出該使用者相關程序所開啟的文件;
+d :后面接目錄,找出某個目錄底下已經(jīng)被開啟的文件
舉例:查看 tar 對應經(jīng)常所打開的文件
[root@localhost tmp]# lsof |grep '^tar'
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
tar 11821 root cwd DIR 8,2 4096 745569 /tmp
tar 11821 root rtd DIR 8,2 4096 2 /
tar 11821 root txt REG 8,2 229652 1199406 /bin/tar
……..
tar 11821 root 2u CHR 136,1 0t0 3 /dev/pts/1
tar 11821 root 3r FIFO 0,6 0t0 38124 pipe
查詢正在執(zhí)行進程的 PID
語法:pidof [-sx] 程序名
選項與參數(shù):
-s:僅列出一個 PID
-x:列出程序所對應進程的父進程的 PID
舉例:
[root@localhost tmp]# ps aux |grep $(pidoftar)|grep -v 'grep'
root 11821 0.0 0.0 4880 944 pts/1 T< 13:09 0:00 tar -jtv -f./etc.tar.bz2