在上一章節中,介紹了檔案與目錄之使用者權限控管與管理,在這一章節中,將要介紹作業系統上的程序管理(process)。
一個Process程序包含相關的要素如下:
在作業系統環境上的Process包含之要素如下:
整個作業系統啟動並載入的時候會有一個main process,即主要的程序,叫做systemd,當其他的程序要啟動的時候,systemd便會fork一個process出來運行指定的程式,當這個程序還沒做完,再放到佇列中等待並休眠(sleeping),接著讓下一個程序可以運行,並這樣不斷的循環下去,直到作業系統重新開啟或關機為止,相關的示意圖如下:
那Linux之程序狀態有那些呢?相關的狀態清單如下:
因為在作業系統中,監控每個Process是可以觀察出資源使用,還有哪個Process有問題,吃很多的資源等,而可以使用top這個指令來即時的監控目前作業系統上每個正在運作的Process之狀態,相關的指令執行後輸出的訊息如下:
[rockylinux@workstation ~]$ top
top - 00:53:36 up 3:28, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 176 total, 1 running, 175 sleeping, 0 stopped, 0 zombie
%Cpu(s): 2.6 us, 7.9 sy, 0.0 ni, 89.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 1817.1 total, 660.8 free, 535.7 used, 620.6 buff/cache
MiB Swap: 2108.0 total, 2108.0 free, 0.0 used. 1124.7 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4177 rockyli+ 20 0 65428 4520 3880 R 5.6 0.2 0:00.03 top
1 root 20 0 186872 14524 9556 S 0.0 0.8 0:03.55 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp
6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H-events_highpri
8 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq
9 root 20 0 0 0 0 S 0.0 0.0 0:00.03 ksoftirqd/0
10 root 20 0 0 0 0 I 0.0 0.0 0:00.27 rcu_sched
11 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
12 root rt 0 0 0 0 S 0.0 0.0 0:00.01 watchdog/0
13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/0
14 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/1
15 root rt 0 0 0 0 S 0.0 0.0 0:00.01 watchdog/1
16 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/1
17 root 20 0 0 0 0 S 0.0 0.0 0:00.11 ksoftirqd/1
19 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/1:0H-events_highpri
21 root 20 0 0 0 0 I 0.0 0.0 0:00.13 kworker/u4:1-events_unbound
22 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
23 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 netns
24 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kauditd
......
或者是可以使用ps aux
指令來看到此作業系統上之process程序的瞬間狀態,相關的執行指令輸出的訊息如下:
[rockylinux@workstation ~]$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.7 186872 14524 ? Ss Sep27 0:03 /usr/lib/systemd/systemd --switched-root
root 2 0.0 0.0 0 0 ? S Sep27 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< Sep27 0:00 [rcu_gp]
root 4 0.0 0.0 0 0 ? I< Sep27 0:00 [rcu_par_gp]
root 6 0.0 0.0 0 0 ? I< Sep27 0:00 [kworker/0:0H-events_highpri]
root 8 0.0 0.0 0 0 ? I< Sep27 0:00 [mm_percpu_wq]
root 9 0.0 0.0 0 0 ? S Sep27 0:00 [ksoftirqd/0]
root 10 0.0 0.0 0 0 ? I Sep27 0:00 [rcu_sched]
root 11 0.0 0.0 0 0 ? S Sep27 0:00 [migration/0]
root 12 0.0 0.0 0 0 ? S Sep27 0:00 [watchdog/0]
......
若ps
指令未帶參數執行的話,則會將目前Shell所有底下正在執行的程式都印出,有時候,Prcoess名稱會太長,導致終端機輸出的訊息不完整,且被截斷,為了要避免這件事情,可以加上w
參數讓被截斷的訊息可以自動換行並印出。
正在運行的工作就被稱為:Process程序,而程序可以分成在前景與背景執行,在前景執行就是在終端機上面執行一個指令,等到這個指令運作完成與結束之後,才可以繼續執行其他的指令,而背景就不一樣了,當Process放到背景中去執行的時候,則終端機可以繼續執行下一個指令,不需要等待。
相關的指令演示與輸出的訊息如下:
[rockylinux@workstation ~]$ sleep 100
當執行上述的指令的時候,需要等待sleep指令完成,即等待100秒之後,終端機才會回復並執行下一個指令,若是改成在背景執行,則可以在指令的後面加上&
即可,相關的指令執行輸出訊息如下:
[rockylinux@workstation ~]$ sleep 100 &
[1] 4459
[rockylinux@workstation ~]$ jobs
[1]+ Running sleep 100 &
[rockylinux@workstation ~]$
當在背景執行的時候,會輸出一個Process id,利用jobs指令則可以看到目前在這個終端機上運行在背景的Process有哪一些,若要將背景的工作較回到前景也是可以的,利用fg指令便可以達到,假設要將上述放在背景中運行的sleep 100
叫回到前景,可以看到這個背景Process運行的編號是1,即[1]+
,則執行fg %1
即可,相關的指令執行輸出的訊息如下:
[rockylinux@workstation ~]$ fg %1
sleep 100
當背景工作結束的時候,有時按下enter鍵,則會跳出下列的訊息,則表示編號為1的背景工作已經結束了,相關的指令執行輸出的訊息如下:
[rockylinux@workstation ~]$
[1]+ Done sleep 100
若要將被叫回前景的Process再次回到背景,則可以使用bg
這個指令,操作的流程如下:
sleep 100 &
指令。fg %1
。jobs -l
觀看目前在背景工作的清單與狀態。bg %1
。jobs -l
觀看目前在背景工作的清單與狀態。[rockylinux@workstation ~]$ jobs -l
[rockylinux@workstation ~]$ sleep 100
^Z
[1]+ Stopped sleep 100
[rockylinux@workstation ~]$ jobs -l
[1]+ 5805 Stopped sleep 100
[rockylinux@workstation ~]$
[rockylinux@workstation ~]$ bg %1
[1]+ sleep 100 &
[rockylinux@workstation ~]$ jobs -l
[1]+ 5805 Running sleep 100 &
[rockylinux@workstation ~]$
sleep 90
在前景,接著試著讓其中斷。