Linux進程管理

博文結構
什麼是程序
工作管理
程序管理

一.什麼是程序

1.在 Linux 系統當中: “ 觸發任何一個事件時,系統都會將他定義成爲一個程序,並且給予這個程序一個 ID ,稱爲 PID ,同時依據啓發這個程序的使用者與相關屬性關係,給予這個 PID 一組有效的權限設置。

2.程序與進程 ( process & program )

執行一個程序或指令 ” 就可以觸發一個事件而取得一個 PID 囉!我們說過,系統應該是僅認識 binary file 的,那麼當我們要讓系統工作的時候,當然就是需要啓動一個 binary file ,那個 binary file 就是程序 ( program )

Linux進程管理

如上圖所示,程序一般是放置在實體磁盤中,然後通過使用者的執行來觸發。觸發後會載入到內存中成爲一個個體,那就是程序。 爲了操作系統可管理這個程序,因此程序有給予執行者的權限 / 屬性等參數,幷包括程序所需要的指令碼與數據或文件數據等, 最後再給予一個 PID 。系統就是通過這個 PID 來判斷該 process 是否具有權限進行工作的

  • 程序 ( program ):通常爲 binary program ,放置在儲存媒體中 (如硬盤、光盤、軟盤、磁帶等), 爲實體文件的型態存在;

  • 進程 ( process ):程序被觸發後,執行者的權限與屬性、程序的程序碼與所需數據等都會被載入內存中, 操作系統並給予這個內存內的單元一個識別碼 ( PID ),可以說,進程就是一個正在運行中的程序。

  • 子程序與父程序:程序彼此之間是有相關性的!以上面的圖示來看,連續執行兩個 bash 後,第二個 bash的父程序就是前一個 bash 。因爲每個程序都有一個 PID ,那某個程序的父程序該如何判斷?就通過 Parent PID( PPID )來判斷即可。
    Linux進程管理

  • fork and exec :程序調用的流程
    其實子程序與父程序之間的關係還挺複雜的,最大的複雜點在於程序互相之間的調用。在 Linux 的程序調用通常稱爲 fork-and-exec 的流程程序都會藉由父程序以複製 ( fork )的方式產生一個一模一樣的子程序, 然後被複製出來的子程序再以 exec的方式來執行實際要進行的程序,最終就成爲一個子程序的存在。

如圖:

Linux進程管理

(1 )系統先以 fork 的方式複製一個與父程序相同的暫存程序,這個程序與父程序唯一的差別就是 PID 不同! 但是這個暫存程序還會多一個 PPID 的參數,PPID 如前所述,就是父程序的程序識別碼啦!然後
( 2 )暫存程序開始以 exec 的方式載入實際要執行的程序,以上述圖示來講,新的程序名稱爲 qqq ,最終子程序的程序碼就會變成 qqq 了!

二.工作管理

  • 這個工作管理 ( job control ) 是用在 bash 環境下的,也就是說: “ 當我們登陸系統取得 bash shell 之後,在單一終端機接口下同時進行多個工作的行爲管理 ” 。舉例來說,我們在登陸 bash 後, 想要一邊複製文件、一邊進行數據搜尋、一邊進行編譯,還可以一邊進行 vim 程序撰寫! 當然我們可以重複登陸那六個命令行的終端機環境中

  • 要進行 bash 的工作管理必須要注意到的限制是:

這些工作所觸發的程序必須來自於你 shell 的子程序(只管理自己的 bash );
前景:你可以控制與下達指令的這個環境稱爲前景的工作 ( foreground );
背景:可以自行運行的工作,你無法使用 [ctrl]+c 終止他,可使用 bg/fg 調用該工作;
背景中 “ 執行 ” 的程序不能等待 terminal(終端)/shell 的輸入( input )

例如:可以隱藏執行程序

[root@localhost ~]# tar -zpcf /tmp/etc.tar.gz /etc/&
[1] 3433            \\PID
  • 觀察目前的背景工作狀態: jobs
[root@localhost ~]# jobs
參數如下:
-l : 除了列出job number與指令串之外,還列出PID
-r :   僅列出正在背景run的工作
- s :僅列出正在背景當中暫停(stop)  的工作
[root@localhost ~]# jobs -l
[1]-  3516 停止                  vim aaa
[2]+  3520 停止                  vim abbb
  • 將背景工作拿到前景來處理: fg
[root@localhost ~]# fg %1

選項與參數:
%jobnumber : jobnumber爲工作號碼(數字),注意,那個%是可有可無的
  • 讓工作在背景下的狀態變成運行中: bg

舉例:執行如下命令後,立刻丟掉背景去工作

[root@localhost ~]# find / -perm /7000 > /tmp/test.txt     \\查詢過程中按下ctrl+z暫停
find: ‘/proc/3585/task/3585/fd/6’: 沒有那個文件或目錄
find: ‘/proc/3585/task/3585/fdinfo/6’: 沒有那個文件或目錄
find: ‘/proc/3585/fd/6’: 沒有那個文件或目錄
find: ‘/proc/3585/fdinfo/6’: 沒有那個文件或目錄
[3]+  已停止               find / -perm /7000 > /tmp/test.txt
[root@localhost ~]# jobs   \\查看一下
[1]-  已停止               vim aaa
[2]   已停止               vim abbb
[3]+  已停止               find / -perm /7000 > /tmp/test.txt
  • 管理背景當中的工作: kill
[root@localhost ~]# kill -signal %jobnumber    \\命令格式
[root@localhost ~]# kill -l
選項與參數
-l :這個是L的小寫,列出目前kill能夠使用的訊號有哪些
signal :代表給與後面接的那個工作什麼樣的指示
-1 : 重新讀取一次參數的配置文件類似(reload)
-2 : 代表與由鍵盤輸入【ctrl】-c同樣的動作
-9 : 立刻強制刪除一個工作
-15 : 以正常的程序方式終止一項工作,與-9不一樣
例如:
[root@localhost ~]# kill -9 %2
[2]   已殺死               vim abbb
  • ps :將某個時間點的程序運行情況擷取下來
[root@localhost ~]# ps aux     \\觀察系統所有的程序數據
[root@localhost ~]# ps -lA       \\也是能夠觀察所有系統數據
[root@localhost ~]# ps axjf       \\連同部分程序樹狀態
選項與參數:
-A :所有的process :均顯示出來,與-e具有同樣的效用;
-a :不與terminal 有關的所有process ;
-u :有效使用者( effective user)相關的process ;
-x:通常與a這個參數一起使用,可列出較完整信息。
輸出長格式規則:
1 :較長、較詳細的將該PID的的信息列出;
j :工作的格式( jobs format )
-f:做一個更爲完整的輸出。0
  • 僅觀察自己的 bash 相關程序: ps -l
[root@localhost ~]# ps -l
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0   3373   3368  0  80   0 - 29191 wait   pts/0    00:00:00 bash
4 T     0   3516   3373  0  80   0 - 37936 signal pts/0    00:00:00 vim
4 T     0   3585   3373  0  80   0 - 30320 signal pts/0    00:00:00 find
0 R     0   3852   3373  0  80   0 - 37233 -      pts/0    00:00:00 ps

F :代表這個程序旗標 ( process flags ),說明這個程序的總結權限,常見號碼有:
若爲 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 執行。詳細的 PRI與 NI 將在下一小節說明。
ADDR/SZ/WCHAN :都與內存有關, ADDR 是 kernel function 
TTY:登陸者的終端機位置,若爲遠端登陸則使用動態終端接口 ( pts/n );
TIME:使用掉的 CPU 時間,注意,是此程序實際花費 CPU 運行的時間,而不是系統時間;
CMD:就是 command 的縮寫,造成此程序的觸發程序之指令爲何
  • 觀察系統所有程序: ps aux
[root@localhost ~]# ps -aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.3 125288  3832 ?        Ss   21:36   0:01 /usr/lib/systemd/syst
root          2  0.0  0.0      0     0 ?        S    21:36   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    21:36   0:00 [ksoftirqd/0]
root          6  0.0  0.0      0     0 ?        S    21:36   0:00 [kworker/u256:0]
root          7  0.0  0.0      0     0 ?        S    21:36   0:00 [migration/0]
root          8  0.0  0.0      0     0 ?        S    21:36   0:00 [rcu_bh]
root          9  0.0  0.0      0     0 ?        R    21:36   0:00 [rcu_sched]
............................
USER :該 process 屬於那個使用者帳號的?
PID :該 process 的程序識別碼。
%CPU :該 process 使用掉的 CPU 資源百分比;
%MEM :該 process 所佔用的實體內存百分比;
VSZ :該 process 使用掉的虛擬內存量 ( KBytes )
RSS :該 process 佔用的固定的內存量 ( KBytes )
TTY :該 process 是在那個終端機上面運行
STAT :該程序目前的狀態,狀態顯示與 ps -l 的 S 旗標相同 ( R/S/T/Z )
START :該 process 被觸發啓動的時間;
TIME :該 process 實際使用 CPU 運行的時間。
COMMAND :該程序的實際指令
[root@localhost ~]# ps -lA
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0      1      0  0  80   0 - 31322 ep_pol ?        00:00:01 systemd
1 S     0      2      0  0  80   0 -     0 kthrea ?        00:00:00 kthreadd
1 S     0      3      2  0  80   0 -     0 smpboo ?        00:00:00 ksoftirqd/0
1 S     0      6      2  0  80   0 -     0 worker ?        00:00:00 kworker/u256:0
..................................
可以發現每個字段與ps -l 的輸出情況相同,但顯示的程序則包括系統所的程序有
  • top :動態觀察程序的變化
選項與參數:
-d :後面可以接秒數,就是整個程序畫面更新的秒數。默認是5秒;
-b :以批次的方式執行top,還有更多的參數可以使用喔!通常會搭配數據流重響來將批次的結果輸出成爲文件。
-n:與-b搭配,意義是,需要進行幾次top的輸出結果。
p :指定某些個PID來進行觀察監測而已。在top執行過程當中可以使用的按鍵指令:
? :示在top 當中可以輸入的按鍵指令;
P :以CPU的使用資源排序顯示;
M :以Memory的使用資源排序顯示;
N :以PID來排序
T :由該Process使用的CPU時間累積(TIME+) 排序。
k :給予某個PID一個訊號( signa1)
r:給予某個PID重新制訂一個nice值。
q。開top軟件的按鍵。
[root@localhost ~]# top -d 2   \\在裏面按下r,則會輸入東西
top - 22:12:54 up 35 min,  2 users,  load average: 0.27, 0.20, 0.14
Tasks: 172 total,   2 running, 168 sleeping,   2 stopped,   0 zombie
%Cpu(s): 12.8 us,  2.1 sy,  0.0 ni, 85.1 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :   999936 total,    76540 free,   540976 used,   382420 buff/cache
KiB Swap:  2097148 total,  2094632 free,     2516 used.   233744 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND           
  2867 root      20   0 1484940 170296  49456 S  6.5 17.0   0:30.15 gnome-shell       
  1747 root      20   0  215824  26092  10428 R  4.0  2.6   0:11.07 Xorg              
  3368 root      20   0  574040  23780  14652 S  2.0  2.4   0:06.29 gnome-terminal-   
  2833 root      20   0 1094016  24516  15828 S  1.5  2.5   0:00.73 gnome-settings-   
  2904 root      20   0  574456   8876   5320 S  1.0  0.9   0:01.23 caribou           
   676 root      20   0    4368    592    496 S  0.5  0.1   0:01.79 rngd              
  2654 root      20   0   27644   1844    620 S  0.5  0.2   0:00.30 dbus-daemon       
  2821 root      20   0  201268   3428   2768 S  0.5  0.3   0:00.31 at-spi2-registr   
 43813 root      20   0  157708   2288   1584 R  0.5  0.2   0:00.03 top               
     1 root      20   0  125288   3832   2404 S  0.0  0.4   0:01.70 systemd           ..........................
top主要分爲兩個畫面,上面的畫面爲整個系統的資源使用狀態,基本上總共有六行,顯示的內容依序是: 

第一行( top...) :目前的時間,亦即是 10:52:16 那個項目;
開機到目前爲止所經過的時間,亦即是 up 1:40, 那個項目;
已經登陸系統的使用者人數,亦即是 2 users, 項目;
系統在 1, 5, 15 分鐘的平均工作負載

第二行( Tasks... ):顯示的是目前程序的總量與個別程序在什麼狀態( running, sleeping, stopped, zombie )

第三行( %Cpus... ):顯示的是 CPU 的整體負載
6.7% us — 用戶空間佔用CPU的百分比。
0.4% sy — 內核空間佔用CPU的百分比。
0.0% ni — 改變過優先級的進程佔用CPU的百分比
92.9% id — 空閒CPU百分比
0.0% wa — IO等待佔用CPU的百分比
0.0% hi — 硬中斷(Hardware IRQ)佔用CPU的百分比
0.0% si — 軟中斷(Software Interrupts)佔用CPU的百分比
0.0% st ---虛擬cpu等待實際cpu的時間百分比

第四行:內存狀態
8306544k total — 物理內存總量(8GB)
7775876k used — 使用中的內存總量(7.7GB)
530668k free — 空閒內存總量(530M)
79236k buffers — 緩存的內存量 (79M)

第五行:swap交換分區
2031608k total — 交換區總量(2GB)
2556k used — 使用的交換區總量(2.5M)
2029052k free — 空閒交換區總量(2GB)
4231276k cached — 緩衝的交換區總量(4GB)

第六行:這個是當在 top 程序當中輸入指令時,顯示狀態的地方。
PID :每個 process 的 ID 啦!
USER :該 process 所屬的使用者;
PR : Priority 的簡寫,程序的優先執行順序,越小越早被執行;
NI : Nice 的簡寫,與 Priority 有關,也是越小越早被執行;
%CPU : CPU 的使用率;
%MEM :內存的使用率;
TIME+ : CPU 使用時間的累加;
[root@localhost ~]# top -b -n 2 > /tmp/123.txt
將top的信息進行2次,然後將結果輸出到/tmp/123.txt文件中
[root@localhost ~]# cat /tmp/123.txt 
  • pstree
選項與參數:

-A :各程序樹之間的連接以ASCII 字符來連接;
-U :各程序樹之間的連接以萬國碼的字符來連接。在某些終端接口下可能會有錯誤;
P :並同時列出每個process 的PID;
u :並同時列出每個process的所屬帳號名稱。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章