博文結構
什麼是程序
工作管理
程序管理
一.什麼是程序
1.在 Linux 系統當中: “ 觸發任何一個事件時,系統都會將他定義成爲一個程序,並且給予這個程序一個 ID ,稱爲 PID ,同時依據啓發這個程序的使用者與相關屬性關係,給予這個 PID 一組有效的權限設置。
2.程序與進程 ( process & program )
執行一個程序或指令 ” 就可以觸發一個事件而取得一個 PID 囉!我們說過,系統應該是僅認識 binary file 的,那麼當我們要讓系統工作的時候,當然就是需要啓動一個 binary file ,那個 binary file 就是程序 ( program )
如上圖所示,程序一般是放置在實體磁盤中,然後通過使用者的執行來觸發。觸發後會載入到內存中成爲一個個體,那就是程序。 爲了操作系統可管理這個程序,因此程序有給予執行者的權限 / 屬性等參數,幷包括程序所需要的指令碼與數據或文件數據等, 最後再給予一個 PID 。系統就是通過這個 PID 來判斷該 process 是否具有權限進行工作的
-
程序 ( program ):通常爲 binary program ,放置在儲存媒體中 (如硬盤、光盤、軟盤、磁帶等), 爲實體文件的型態存在;
-
進程 ( process ):程序被觸發後,執行者的權限與屬性、程序的程序碼與所需數據等都會被載入內存中, 操作系統並給予這個內存內的單元一個識別碼 ( PID ),可以說,進程就是一個正在運行中的程序。
-
子程序與父程序:程序彼此之間是有相關性的!以上面的圖示來看,連續執行兩個 bash 後,第二個 bash的父程序就是前一個 bash 。因爲每個程序都有一個 PID ,那某個程序的父程序該如何判斷?就通過 Parent PID( PPID )來判斷即可。
- fork and exec :程序調用的流程
其實子程序與父程序之間的關係還挺複雜的,最大的複雜點在於程序互相之間的調用。在 Linux 的程序調用通常稱爲 fork-and-exec 的流程程序都會藉由父程序以複製 ( fork )的方式產生一個一模一樣的子程序, 然後被複製出來的子程序再以 exec的方式來執行實際要進行的程序,最終就成爲一個子程序的存在。
如圖:
(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的所屬帳號名稱。