始終不能明白進(jìn)程的正確理解和定義。就說(shuō)我自己的理解吧
進(jìn)程是 CPU 調(diào)度的基本單位,對(duì)于 unix like 來(lái)說(shuō),當(dāng)我們登錄取得 bash 時(shí),系統(tǒng)會(huì)根據(jù)用戶(hù)的uid 和 gid 分配給我們一個(gè)進(jìn)程,在當(dāng)前 bash 下,這個(gè)進(jìn)程就是所有進(jìn)程的父進(jìn)程,當(dāng)我們執(zhí)行一些命令時(shí),每個(gè)命令都由一個(gè)新的子進(jìn)程來(lái)完成。
在單一終端下,可以同時(shí)進(jìn)行多項(xiàng)工作,如:一邊復(fù)制數(shù)據(jù),一邊查詢(xún)文件。每一項(xiàng)工作都由獨(dú)立的子進(jìn)程來(lái)完成,他們的父進(jìn)程就是當(dāng)前終端對(duì)應(yīng) bash 的那個(gè)進(jìn)程。
對(duì)于終端來(lái)說(shuō)分為前臺(tái)和后臺(tái)
前臺(tái):你可以控制于執(zhí)行命令的那個(gè)環(huán)境(串行工作)
后臺(tái):可以自行運(yùn)行的工作,無(wú)法使用 ctrl+c 終端它(并行工作)
如果所有的工作都由前臺(tái)來(lái)做,那么必須等一個(gè)工作處理完成才能進(jìn)行下一個(gè)工作,這樣做效率很低,因此我們可以把一些不需要人工交互的工作放到后臺(tái),使多個(gè)工作可以共同執(zhí)行
說(shuō)明:前臺(tái)和后臺(tái)是針對(duì)同一個(gè)終端來(lái)說(shuō),tty1環(huán)境是無(wú)法管理 tty2的
語(yǔ)法:jobs[-lrs]
選項(xiàng)與參數(shù):
-l:列出工作與命令串之外,同時(shí)列出 PID
-r:僅列出后臺(tái) run 的工作
-s: 僅列出后臺(tái) 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 &
以上輸出的格式為:工作序號(hào)|順序 PID 狀態(tài) 命令
順序:分為(+,-,空白),+號(hào)代表最后一個(gè)被放到后臺(tái)的工作;-號(hào)代表倒數(shù)第二個(gè)被放到后臺(tái)的工作,倒數(shù)第三個(gè)及以后用空白
[root@localhost tmp]# tar -jcpP -f/tmp/etc.tar.bz2 /etc &
[2] 8985
其中【2】表示工作號(hào),8985表示處理這個(gè)工作的子進(jìn)程號(hào)
如果我們將壓縮信息顯示出來(lái)
[root@localhost tmp]# tar –jcpP -v -f/tmp/etc.tar.bz2 /etc &
雖然這個(gè)工作在后臺(tái)進(jìn)行,但是輸出信息還是會(huì)在前臺(tái)輸出的,因此可以應(yīng)用數(shù)據(jù)流重定向?qū)⑤敵鲂畔?xiě)到文件
[root@localhost tmp]# vim newfile.txt
=>按下 ctrl+z
[1]+ Stopped vimnewfile.txt
語(yǔ)法:fg %工作序號(hào)
fg –
fg +
語(yǔ)法:fg %工作序號(hào)
舉例:
[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 &
語(yǔ)法:kill –signal %工作序號(hào)
Sighal:
1:重新讀取一次參數(shù)的配置文件
2:代表有 ctrl+c 同樣的操作
9:立刻強(qiáng)制刪除一個(gè)工作
15.以正常方式終止工作
說(shuō)明:unix like 中的信號(hào)64個(gè),比較復(fù)雜以后在整體學(xué)習(xí)
舉例:
[root@localhost tmp]# jobs -l;kill -9 %1; jobs -l
[1]+ 已殺死 tar -jcpP -f /tmp/etc1.tar.bz2 /etc
靜態(tài)進(jìn)程查看(ps)
語(yǔ)法:
ps aux|ps -lA 查看系統(tǒng)所有進(jìn)程數(shù)據(jù)
ps –l 查看自己相關(guān)進(jìn)程
ps –axjf 查看進(jìn)程樹(shù)
舉例:
[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 程序的進(jìn)程為所有進(jìn)程的父進(jìn)程 tar 命令內(nèi)部會(huì)調(diào)用 bzip2命令因此產(chǎn)生10952進(jìn)程,且bzip2進(jìn)程的父進(jìn)程就是 tar 進(jìn)程
l F:代表這個(gè)程序旗標(biāo) (process flags),說(shuō)明這個(gè)程序的總結(jié)權(quán)限,常見(jiàn)號(hào)碼有:
若為 4 表示此程序的權(quán)限為 root ;
若為 1 則表示此子程序僅進(jìn)行復(fù)制(fork)而沒(méi)有實(shí)際運(yùn)行(exec)。
l S:代表這個(gè)程序的狀態(tài) (STAT),主要的狀態(tài)有:
R (Running):該程序正在運(yùn)行中;
S (Sleep):該程序目前正在睡眠狀態(tài)(idle),但可以被喚醒(signal)。
D :不可被喚醒的睡眠狀態(tài),通常這支程序可能在等待 I/O 的情況(ex>列印)
T :停止?fàn)顟B(tài)(stop),可能是在工作控制(背景暫停)或除錯(cuò) (traced) 狀態(tài);
Z (Zombie):僵尸狀態(tài),程序已經(jīng)終止但卻無(wú)法被移除至內(nèi)存外。
l UID/PID/PPID:代表[此程序被該 UID 所擁有/程序的 PID 號(hào)碼/此程序的父程序 PID 號(hào)碼]
l C:代表 CPU 使用率,單位為百分比;
l PRI/NI:Priority/Nice 的縮寫(xiě),代表此程序被 CPU 所運(yùn)行的優(yōu)先順序,數(shù)值越小代表該程序越快被 CPU 運(yùn)行。
l ADDR/SZ/WCHAN:都與內(nèi)存有關(guān),ADDR 是 kernel function,指出該程序在內(nèi)存的哪個(gè)部分,如果是個(gè) running 的程序,一般就會(huì)顯示[- ] / SZ 代表此程序用掉多少內(nèi)存 / WCHAN 表示目前程序是否運(yùn)行中,同樣的,若為 - 表示正在運(yùn)行中。
l TTY:登陸者的終端機(jī)位置,若為遠(yuǎn)程登陸則使用動(dòng)態(tài)終端介面 (pts/n);
l TIME:使用掉的 CPU 時(shí)間,注意,是此程序?qū)嶋H花費(fèi) CPU 運(yùn)行的時(shí)間,而不是系統(tǒng)時(shí)間;
l CMD:簡(jiǎn)單描述命令
查看 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 屬於那個(gè)使用者帳號(hào)的?
PID :該 process 的程序識(shí)別碼。
%CPU:該 process 使用掉的 CPU 資源百分比;
%MEM:該 process 所占用的實(shí)體內(nèi)存百分比;
VSZ :該 process 使用掉的虛擬內(nèi)存量 (Kbytes)
RSS :該 process 占用的固定的內(nèi)存量 (Kbytes)
TTY :該 process 是在那個(gè)終端機(jī)上面運(yùn)行,若與終端機(jī)無(wú)關(guān)則顯示 ?,另外, tty1-tty6 是本機(jī)上面的登陸者程序,若為 pts/0 等等的,則表示為由網(wǎng)絡(luò)連接進(jìn)主機(jī)的程序。
STAT:該程序目前的狀態(tài),狀態(tài)顯示與 ps -l 的 S 旗標(biāo)相同 (R/S/T/Z)
START:該 process 被觸發(fā)啟動(dòng)的時(shí)間;
TIME :該 process 實(shí)際使用 CPU 運(yùn)行的時(shí)間。
COMMAND:詳細(xì)描述命令
查看 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
語(yǔ)法:top[-d 數(shù)字] [-bn 數(shù)字] [-p pid]
選項(xiàng)與參數(shù)
-d:動(dòng)態(tài)刷新時(shí)間間隔
-b:以批次方式執(zhí)行,與-n 連用
-n:執(zhí)行次數(shù)
-p:查看單個(gè)進(jìn)程信息
在top 執(zhí)行過(guò)程中可以使用的命令
?:顯示幫助文檔
P:以 CPU 使用資源排序
M: 以 mem 使用資源排序
N: 以 PID 排序
T: 以 TIME+排序
k:給某個(gè) PID 一個(gè)信號(hào)
r:給某個(gè) PID 設(shè)置新的 Ni 值
q:離開(kāi)
Z|z:設(shè)置|取消顏色
B|b:設(shè)置|取消關(guān)鍵字加粗
W:將設(shè)置信息寫(xiě)入配置文件
n:顯示進(jìn)程數(shù)量
c:顯示完整的 command
u:設(shè)置查看某個(gè) USER 的進(jìn)程
舉例:
[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
特殊字段說(shuō)明
us 用戶(hù)空間占用 CPU 百分比
sy 內(nèi)核空間占用 CPU 百分比
ni 用戶(hù)進(jìn)程空間內(nèi)改變過(guò)優(yōu)先級(jí)的進(jìn)程占用 CPU 百分比
id 空閑 CPU 百分比
wa 等待輸入輸出的 CPU 時(shí)間百分比
hi 硬件中斷
si 軟件中斷
st: 實(shí)時(shí)
USER:該 process 所屬的使用者;
PR :Priority 的簡(jiǎn)寫(xiě),程序的優(yōu)先運(yùn)行順序,越小越早被運(yùn)行;
NI :Nice 的簡(jiǎn)寫(xiě),與 Priority 有關(guān),也是越小越早被運(yùn)行;
%CPU:CPU 的使用率;
%MEM:內(nèi)存的使用率;
TIME+:CPU 使用時(shí)間的累加;
語(yǔ)法:pstree[-A|-U] [-up]
選項(xiàng)與參數(shù)
-A :各程序樹(shù)之間的連接以 ASCII 字節(jié)來(lái)連接;
-U :各程序樹(shù)之間的連接以 unicode 的字節(jié)來(lái)連接。在某些終端介面下可能會(huì)有錯(cuò)誤;
-p :并同時(shí)列出每個(gè) process 的 PID;
-u :并同時(shí)列出每個(gè) process 的所屬帳號(hào)名稱(chēng)。
舉例
[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)
進(jìn)程的管理就是給進(jìn)程發(fā)送一個(gè)信號(hào),告訴進(jìn)程做什么事情
語(yǔ)法:kill –signal PID
killall [-iIe] –signal 服務(wù)名稱(chēng)
說(shuō)明 使用 kill 需要知道 PID,killall 根據(jù)服務(wù)發(fā)送信號(hào)
舉例1:給 bash 進(jìn)程發(fā)送信號(hào)1
[root@localhost ~]# kill -1 $(ps aux |awk '{print $11 "" $2}'|grep '^bash'|awk '{print $2}')
舉例2:給 bash 這個(gè)服務(wù)對(duì)應(yīng)的進(jìn)程發(fā)送信號(hào)1
[root@localhost ~]# killall -i -1 bash
Kill bash(10202) ? (y/N)
進(jìn)程的優(yōu)先級(jí)相關(guān)的只要是 PRI 與 NI 這兩個(gè)值, 數(shù)值越小優(yōu)先級(jí)越高,PRI 是系統(tǒng)內(nèi)核設(shè)置的,用戶(hù)無(wú)法設(shè)置,用戶(hù)只能是指 NI 值來(lái)改變進(jìn)程的優(yōu)先級(jí)
進(jìn)程的優(yōu)先級(jí)=PRI+NI
在執(zhí)行命令時(shí)給予新的 NI 值:
語(yǔ)法:nice –n 數(shù)值 命令
數(shù)值的范圍從-20~19
設(shè)置以及啟動(dòng)的進(jìn)程
語(yǔ)法: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)常會(huì)遇到這種情況,要?jiǎng)h除某個(gè)文件或卸載某個(gè)文件系統(tǒng),提示我們正在使用,無(wú)法被刪除,此時(shí)我們就需要找到哪些進(jìn)程正在使用它們,“殺死“這些進(jìn)程后我們才能刪除這些文件
查詢(xún)文件被哪個(gè)進(jìn)程使用(fuser)
語(yǔ)法:fuser[-umv] [-ki -signal] file/dir
選項(xiàng)與參數(shù):
-u:列出 user
-m:會(huì)查詢(xún)后面文件所在的文件系統(tǒng)
-v:列出詳細(xì)命令
-k:找出使用該文件 PID 并試圖發(fā)送 SIGKILL 這個(gè)信號(hào)給這個(gè)進(jìn)程
-i:與-k 連用,發(fā)送信號(hào)之前詢(xún)問(wèn)用戶(hù)
舉例
[root@localhost tmp]# tar -jtv -f ./etc.tar.bz2 > ./newfile.txt
= >按下 ctrl+z 工作在后臺(tái)暫停
[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
= >這個(gè)文件正在被11822這個(gè)進(jìn)程所使用
查詢(xún)進(jìn)程正在使用的文件(lsof)
語(yǔ)法:lsof [-aUu][+d]
選項(xiàng)與參數(shù):
-a :多項(xiàng)數(shù)據(jù)需要同時(shí)成立才顯示出結(jié)果時(shí)
-U :僅列出 Unixlike 系統(tǒng)的 socket 文件類(lèi)型;
-u :后面接 username,列出該使用者相關(guān)程序所開(kāi)啟的文件;
+d :后面接目錄,找出某個(gè)目錄底下已經(jīng)被開(kāi)啟的文件
舉例:查看 tar 對(duì)應(yīng)經(jīng)常所打開(kāi)的文件
[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
查詢(xún)正在執(zhí)行進(jìn)程的 PID
語(yǔ)法:pidof [-sx] 程序名
選項(xiàng)與參數(shù):
-s:僅列出一個(gè) PID
-x:列出程序所對(duì)應(yīng)進(jìn)程的父進(jìn)程的 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