歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> linux之進程

linux之進程

日期:2017/3/3 17:01:33   编辑:關於Linux

在linux每執行一個二進制文件都會產生一個進程並生成一個進程PID。進程除了自身的ID外,還有父進程ID(ppid),所有進程的祖先進程是同一個進程,它叫做init進程,PID為1。

當用戶從一個終端登陸時,便獲得一個此次執行的bash進程的PID。用戶執行的每一條指令都是這個PID的子進程。

linux通過fork-and-exec的流程來產生子進程:首先會通過父進程以復制 (fork) 的方式產生一個一模一樣的子進程, 然後被復制出來的子進程再以 exec 的方式來運行實際要進行的程序,最終就成為一個子進程的存在。

僵屍進程:當該程序應該已經運行完畢,或者是因故應該要終止了,但是該程序的父程序卻無法完整的將該程序結束掉,而造成那個程序一直存在內存當中,形成僵屍進程。

進程後台運行與暫停

通過在命令結尾加上&,可以時命令在後台運行而不影響前台。
通過[ctrl]-z可以將前台正在運行的進程暫停。

jobs

查看當前後台工作狀態:
選項與參數:
-l :除了列出 job number 與命令串之外,同時列出 PID 的號碼;
-r :僅列出正在背景 run 的工作;
-s :僅列出正在背景當中暫停 (stop) 的工作。
[zsp@sky]~$ vim a
[1]+  已停止               vim a
[zsp@sky]~$ vim b
[2]+  已停止               vim b
[zsp@sky]~$ jobs
[1]-  已停止               vim a
[2]+  已停止               vim b
那個+代表最近一個被暫停到後台的工作,且當執行fg命令時在後台下默認會被取用的那個工作。-代表最近最後第二個被暫停到後台中的工作號碼

fg

將後台的工作拿出來處理

%可以指定處理哪一個後台任務

[zsp@sky]~$ fg
vim b
[2]+  已停止               vim b
[zsp@sky]~$ jobs
[1]-  已停止               vim a
[2]+  已停止               vim b
[zsp@sky]~$ fg %1
vim a
[1]+  已停止               vim a
[zsp@sky]~$ jobs
[1]+  已停止               vim a
[2]-  已停止               vim b

bg

讓一個被暫停的任務在後台繼續運行

kill

停止或重啟後台任務
-l :這個是 L 的小寫,列出目前 kill 能夠使用的訊號 (signal) 有哪些?
-1 :重新讀取一次參數的配置文件,啟動被終止的進程;
-2 :代表與由鍵盤輸入 [ctrl]-c 同樣的動作;
-9 :立刻強制刪除一個工作;
-15:以正常的程序方式終止一項工作。與 -9 是不一樣的。

nohup

脫機執行後台進程
當後台任務正在執行時,若注銷登錄,那麼任務也將停止。可以使用nohup來使任務在注銷後繼續執行。
nohup [命令與參數] &

ps

將某個時間點的進程運行情況列下來
選項與參數:
-A :所有的 process 均顯示出來,與 -e 具有同樣的效用;
-a :不與 terminal 有關的所有 process ;
-u :有效使用者 (effective user) 相關的 process ;
x :通常與 a 這個參數一起使用,可列出較完整資訊。

輸出格式規劃:

l :較長、較詳細的將該 PID 的的資訊列出;
j :工作的格式 (jobs format)
-f :做一個更為完整的輸出。

常用:

ps aux 列出系統所有的程序數據
ps -l 僅列出自己 bash 程序
[zsp@sky]~$ ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1000  1955  1948  0  80   0 -  6086 wait   pts/0    00:00:00 bash
0 R  1000  2917  1955  0  80   0 -  2530 -      pts/0    00:00:00 ps
從左到右各個字段意思
F:代表這個程序標志,說明這個程序的權限,常見號碼有:
若為 4 表示此程序的權限為 root ;
若為 1 則表示此子程序僅進行復制(fork)而沒有實際運行(exec)。
S:代表這個程序的狀態 (STAT),主要的狀態有:
R (Running):該程序正在運行中;
S (Sleep):該程序目前正在睡眠狀態(idle),但可以被喚醒(signal)。
D :不可被喚醒的睡眠狀態,通常這支程序可能在等待 I/O 的情況(ex>列印)
T :停止狀態(stop),可能是在工作控制(背景暫停)或除錯 (traced) 狀態;
Z (Zombie):僵屍狀態,程序已經終止但卻無法被移除至內存外。
UID/PID/PPID:代表此程序被該 UID 所擁有/程序的 PID 號碼/此程序的父程序 PID 號碼』
C:代表 CPU 使用率,單位為百分比;
PRI/NI:Priority/Nice 的縮寫,代表此程序被 CPU 所運行的優先順序,數值越小代表該程序越快被 CPU 運行。
ADDR/SZ/WCHAN:都與內存有關,ADDR 是 kernel function,指出該程序在內存的哪個部分,如果是個 running 的程序,一般就會顯示-/ SZ 代表此程序用掉多少內存 / WCHAN 表示目前程序是否運行中,同樣的, 若為 - 表示正在運行中。
TTY:登陸者的終端機位置,若為遠程登陸則使用動態終端介面 (pts/n);
TIME:使用掉的 CPU 時間,注意,是此程序實際花費 CPU 運行的時間,而不是系統時間;
CMD:就是 command 的縮寫,造成此程序的觸發程序之命令為何。
[zsp@sky]~$ ps aux | head -n 2
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  24440  2416 ?        Ss   16:19   0:01 /sbin/init
root         2  0.0  0.0      0     0 ?        S    16:19   0:00 [kthreadd]
從左到右各個字段意思
USER:該 process 屬於那個使用者帳號的?
PID :該 process 的程序識別碼。
%CPU:該 process 使用掉的 CPU 資源百分比;
%MEM:該 process 所占用的實體內存百分比;
VSZ :該 process 使用掉的虛擬內存量 (Kbytes)
RSS :該 process 占用的固定的內存量 (Kbytes)
TTY :該 process 是在那個終端機上面運行,若與終端機無關則顯示 ?,另外, tty1-tty6 是本機上面的登陸者程序,若為 pts/0 等等的,則表示為由網絡連接進主機的程序。
STAT:該程序目前的狀態,狀態顯示與 ps -l 的 S 標志相同 (R/S/T/Z)
START:該 process 被觸發啟動的時間;
TIME :該 process 實際使用 CPU 運行的時間。
COMMAND:該程序的實際命令是什麼

top

動態觀列出進程的變化

相對與 ps 是列出一個時間點的程序狀態, top 則可以持續偵測程序運行的狀態
選項與參數:
-d :後面可以接秒數,就是整個進程畫面更新的秒數。默認是 5 秒;
-b :以批量的方式運行top,通常會搭配數據流重導向來將批量的結果輸出成為文件。
-n :與 -b 搭配,意義是,需要進行幾次 top 的輸出結果。
-p :指定某些個 PID 來進行觀察監測而已。
在 top 運行過程當中可以使用的按鍵命令:
? :顯示在 top 當中可以輸入的按鍵命令;
P :以 CPU 的使用資源排序顯示;
M :以 Memory 的使用資源排序顯示;
N :以 PID 來排序
T :由該 Process 使用的 CPU 時間累積 (TIME+) 排序。
k :給予某個 PID 一個訊號 (signal)
r :給予某個 PID 重新制訂一個 nice 值。
q :離開 top 軟件的按鍵。
[zsp@sky]~$ top -d 3 -p 2308 -n 3 > top.txt
[zsp@sky]~$ cat top.txt 
top - 17:47:09 up  1:27,  1 user,  load average: 0.36, 0.51, 0.56
Tasks:   1 total,   0 running,   1 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.8%us,  0.5%sy,  0.0%ni, 97.8%id,  0.8%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1965880k total,  1403864k used,   562016k free,   146084k buffers
Swap:  2009084k total,        0k used,  2009084k free,   503384k cached


 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND            
 2308 zsp      20   0  422m  41m  23m S    2  2.1   1:24.12 plugin-containe
每一行解釋:
第一行(top...):
目前的時間,即是17:47:09 那個字段;啟動到目前為止所經過的時間,即是 up 1:27那個字段;已經登陸系統的使用者人數,即是 1 user那個字段;系統在 1, 5, 15 分鐘的平均工作負載。
第二行(Tasks...):
顯示的是目前程序的總量與個別程序在什麼狀態(running, sleeping, stopped, zombie)。
第三行(Cpus...):顯示的是 CPU 的整體負載,每個項目可使用 ?
第四行與第五行:表示目前的實體內存與虛擬內存 (Mem/Swap) 的使用情況。
第六行:這個是當在 top 程序當中輸入命令時,顯示狀態的地方。
最後一行:每個 process 使用的資源情況。
PID :每個 process 的 ID
USER:該 process 所屬的使用者;
PR :Priority 的簡寫,程序的優先運行順序,越小越早被運行;
NI :Nice 的簡寫,與 Priority 有關,也是越小越早被運行;
%CPU:CPU 的使用率;
%MEM:內存的使用率;
TIME+:CPU 使用時間的累加;

pstree

將進程之間的關系以樹的形式顯示出來
-A :各程序樹之間的連接以 ASCII 字節來連接;
-U :各程序樹之間的連接以萬國碼的字節來連接。在某些終端介面下可能會有錯誤;
-p :並同時列出每個 process 的 PID;
-u :並同時列出每個 process 的所屬帳號名稱。

killall

根據進程名字管理進程
killall -signal 命令名稱
-i :interactive 的意思,互動式的,若需要刪除時,會出現提示字節給使用者;
-e :exact 的意思,表示『後面接的 command name 要一致』,但整個完整的命令
不能超過 15 個字節。
-I :命令名稱(可能含參數)忽略大小寫。
Copyright © Linux教程網 All Rights Reserved