Linux基礎命令(五):程序——ps、top、jobs、bg、fg、kill、killall、shutdown
目錄
程序
Linux通過使用程序來管理多工。程序就是Linux組織安排正在等待使用CPU的各種程式的方式。
-
ps – 報告當前程序快照
-
top – 顯示任務
-
jobs – 列出活躍的任務
-
bg – 把一個任務放到後臺執行
-
fg – 把一個任務放到前臺執行
-
kill – 給一個程序傳送訊號
-
killall – 殺死指定名字的程序
-
shutdown – 關機或重啟系統
系統啟動的時候,核心先把一些它自己的活動初始化為程序,然後執行一個叫做 init 的程式。init, 依次地,再執行一系列的稱為 init 指令碼的 shell 指令碼(位於/etc),它們可以啟動所有的系統服務。 其中許多系統服務以守護(daemon)程式的形式實現,守護程式僅在後臺執行,沒有任何使用者介面(User Interface)。因此,即使我們沒有登入系統,系統也在忙於執行一些例行事務。
在程序方案中,一個程式可以發動另一個程式被表述為一個父程序可以產生一個子程序。
核心維護每個程序的資訊,以此來保持各個程序組織有序。系統會分配給每個程序一個數字,叫做程序(process) ID 或 PID。PID 號按升序分配,init 程序的 PID 總是1。核心也對分配給每個程序的記憶體和就緒狀態進行跟蹤以便繼續執行這個程序。 像檔案一樣,程序也有所有者和使用者 ID,有效使用者 ID,等等。
檢視程序
有多個用來檢視程序的命令,最常用的是 ps 。預設情況下,ps 不會顯示很多程序資訊,只是列出與當前終端會話相關的程序。比如我們不加引數的呼叫該命令:
[email protected] :/mnt/c/Users/52840$ ps
PID TTY TIME CMD
2 tty1 00:00:00 bash
85 tty1 00:00:00 ps
程序 2 代表命令bash,程序 85 代表命令ps。其中,欄位TTY是“Teletype”的縮寫,是指程序的控制終端。TIME欄位表示程序執行全過程所消耗的CPU時間長度。(上面兩個命令的消耗基本為零)
我們可以加上 x 選項(注意不加短橫線),以展示所有終端的程序。
[email protected]:/mnt/c/Users/52840$ ps x PID TTY STAT TIME COMMAND 2 tty1 Ss 0:00 -bash 86 tty2 Ss 0:00 -bash 169 tty2 R 0:00 ps x
有時候在TTY一欄中會出現“?”,表示這個程序沒有控制終端。系統中執行的程序較多的時候,可以將ps命令的輸出結果使用管道輸出到less中,以方便檢視。可以看到,上面的結果中出現了一個新的欄位 STAT,表示程序當前狀態。
狀態 | 含義 |
---|---|
R | 執行中。這意味著,程序正在執行或準備執行。 |
S | 正在睡眠。程序沒有執行,而是,正在等待一個事件, 比如說,一個按鍵或者網路分組。 |
D | 不可中斷睡眠。程序正在等待 I/O,比方說,一個磁碟驅動器的 I/O。 |
T | 已停止. 已經指示程序停止執行。稍後介紹更多。 |
Z | 死程序或“殭屍”程序。這是一個已經終止的子程序,但是它的父程序還沒有清空它。 (父程序沒有把子程序從程序表中刪除) |
< | 高優先順序程序。這可能會授予一個程序更多重要的資源,給它更多的 CPU 時間。 程序的這種屬性叫做 niceness。具有高優先順序的程序據說是不好的(less nice), 因為它佔用了比較多的 CPU 時間,這樣就給其它程序留下很少時間。 |
N | 低優先順序程序。 一個低優先順序程序(一個“nice”程序)只有當其它高優先順序程序被服務了之後,才會得到處理器時間。 |
另一個常用的選項組合是 aux (前面不加短橫線),它會顯示所有使用者的程序。並使用BSD風格的輸出結果。
[email protected]:/mnt/c/Users/52840$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 10432 584 ? Ss 18:36 0:00 /init
ldz 2 0.0 0.0 26328 4116 tty1 Ss 18:36 0:00 -bash
ldz 86 0.0 0.0 26328 4116 tty2 Ss 18:41 0:00 -bash
ldz 170 0.0 0.0 41992 1844 tty1 R 19:42 0:00 ps aux
標題 | 含義 |
---|---|
USER | 使用者 ID. 程序的所有者。 |
%CPU | 以百分比表示的 CPU 使用率 |
%MEM | 以百分比表示的記憶體使用率 |
VSZ | 虛擬記憶體大小 |
RSS | 程序佔用的實體記憶體的大小,以千位元組為單位。 |
START | 程序啟動的時間點。過了當天的24時,則用天表示。 |
用 top 命令動態檢視程序(相當於工作管理員)
ps 命令只提供其執行時刻的系統狀態快照。為了檢視動態的資訊,可以使用top命令。top 命令以程序活動順序顯示連續更新的系統程序列表(預設三秒更新一次)。top 顯示結果由兩部分組成: 上面是系統概要,下面是程序列表,以 CPU 的使用率排序。
top - 19:57:40 up 1:21, 0 users, load average: 0.52, 0.58, 0.59
Tasks: 4 total, 1 running, 3 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.1 hi, 0.0 si, 0.0 st
KiB Mem : 16619820 total, 9563308 free, 6820036 used, 236476 buff/cache
KiB Swap: 36708220 total, 36699112 free, 9108 used. 9658928 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 10432 584 548 S 0.0 0.0 0:00.02 init
2 ldz 20 0 26328 4116 4024 S 0.0 0.0 0:00.15 bash
86 ldz 20 0 26328 4116 3904 S 0.0 0.0 0:00.14 bash
172 ldz 20 0 42228 1928 1404 R 0.0 0.0 0:00.00 top
其中系統概要包含許多有用資訊。
行號 | 欄位 | 意義 |
---|---|---|
1 | top | 程式名。 |
19:57:40 | 當前時間。 | |
up 1:21 | 這是正常執行時間。它是計算機從上次啟動到現在所執行的時間。 在這個例子裡,系統已經運行了六個半小時。 | |
0 users | 有兩個使用者登入系統。 | |
load average: | 載入平均值是指,等待執行的程序數目,也就是說,處於可以執行狀態並共享 CPU 的程序個數。 這裡展示了三個數值,每個數值對應不同的時間段。第一個是最後60秒的平均值, 下一個是前5分鐘的平均值,最後一個是前15分鐘的平均值。若平均值低於1.0,則指示計算機 工作不忙碌。 | |
2 | Tasks: | 總結了程序數目和這些程序的各種狀態。 |
3 | Cpu(s): | 這一行描述了 CPU 正在進行的活動的特性。 |
0.3%us | 0.3% 的 CPU 被用於使用者程序。這意味著程序在核心之外。 | |
0.3%sy | 0.3%的 CPU 時間被用於系統(核心)程序。 | |
0.0%ni | 0.0%的 CPU 時間被用於"nice"(低優先順序)程序。 | |
99.3%id | 99.3%的 CPU 時間是空閒的。 | |
0.0%wa | 0.0%的 CPU 時間來等待 I/O。 | |
4 | Mem: | 展示實體記憶體的使用情況。 |
5 | Swap: | 展示交換分割槽(虛擬記憶體)的使用情況。 |
top 程式執行過程中接受一系列從鍵盤輸入的命令。其中h 命令用來顯示程式的幫助資訊,q 命令退出top程式。
中斷程序
在終端中,通常情況下(不是全部)可以通過輸入 Ctrl-c,中斷一個程式。
把程序放置到後臺執行
我們可以在不終止程式的情況下讓shell提示符返回。即可以在終端中執行其他命令或程式。為了啟動一個程式並讓它立即在後臺 執行,我們在程式命令之後,加上”&”字元:
[email protected]:/mnt/c/Users/52840$ gedit &
[1] 580
[email protected]:/mnt/c/Users/52840$
執行命令之後,gedit編輯器窗口出現,並且立即返回shell提示符。同時列印一條任務控制資訊,這條資訊告訴我們,已經啟動了任務號為 1 ,PID 為580的程式。
我們可以利用 jobs 命令,列出從本終端中啟動的任務。
[email protected]:/mnt/c/Users/52840$ jobs
[1]+ Running gedit &
結果顯示本終端中有一個任務,編號為 1,正在執行,啟動該任務的命令為 gedit & 。
程序返回到前臺執行
一個在後臺執行的程序對一切來自鍵盤的輸入都免疫,也不能用 Ctrl-c 來中斷它。我們可以使用 fg 命令讓一個程序返回前臺,格式為fg %任務號:
[email protected]:/mnt/c/Users/52840$ jobs
[1]+ Running gedit &
[email protected]:/mnt/c/Users/52840$ fg %1
gedit
如果只有一個後臺任務,可以不指定任務號。
(暫時)停止程序
可以在終端中輸入 Ctrl-z 來暫停一個程序,而不是關閉它。
[email protected]:/mnt/c/Users/52840$ gedit
^Z
[1]+ Stopped gedit
[email protected]:/mnt/c/Users/52840$
停止程式之後,我們無法對gedit 視窗做任何操作。可以使用 fg 命令恢復程式到前臺,或者使用 bg 命令將暫停的程式轉移到後臺(用法同 fg)。
從命令列啟動圖形介面程式有兩個好處,第一個是你想要啟動的程式可能沒有在視窗管理器選單中列出來(比如xlogo,一個顯示X圖示的視窗程式),第二個是從命令列啟動一個程式, 能夠看到一些錯誤資訊,如果從圖形介面中執行程式的話,這些資訊是不可見的。
有時候, 一個程式不能從圖形介面選單中啟動。通過從命令列中啟動它,我們可能會看到能揭示問題的錯誤資訊。一些圖形介面程式還有許多有意思並且有用的命令列選項。
訊號
訊號是作業系統與程式之間進行通訊時所採用的幾種方式中的一種。 我們可以使用組合鍵和命令向執行的程式傳送一個訊號,程式,相應地,監聽訊號的到來,當程式接收到訊號之後,則做出響應。
kill命令用來“殺死”程式(任何終端的)。格式為:kill PID 或者 kill %任務號
[email protected]:/mnt/c/Users/52840$ xlogo &
[1] 715
[email protected]:/mnt/c/Users/52840$ kill 715
[1]+ Terminated xlogo
kill 命令不是真的“殺死”程式,而是給程式傳送訊號。 在使用 Ctrl-c 和 Ctrl-z 的過程中我們已經看到訊號的實際用法。當終端接受了其中一個按鍵組合後,它會給在前端執行的程式傳送一個訊號。在使用 Ctrl-c 的情況下,會發送一個叫做 INT(Interrupt,中斷)的訊號;當使用 Ctrl-z 時,則傳送一個叫做 TSTP(Terminal Stop,終端停止)的訊號。
通過kill命令給程序傳送訊號
常用語法形式:kill -signal PID...
注意,訊號既可以是編號,也可以用名字來指定,還可以在名字前面加上字母“SIG”
如果在命令列中沒有指定訊號,那麼預設情況下,傳送 TERM(Terminate,終止)訊號。
編號 | 名字 | 含義 |
---|---|---|
1 | HUP | 掛起(Hangup)。這是美好往昔的殘留部分,那時候終端機通過電話線和調變解調器連線到 遠端的計算機。這個訊號被用來告訴程式,控制的終端機已經“結束通話”。 通過關閉一個終端會話,可以展示這個訊號的作用。在當前終端執行的前臺程式將會收到這個訊號並終止。
許多守護程序也使用這個訊號,來重新初始化。這意味著,當一個守護程序收到這個訊號後, 這個程序會重新啟動,並且重新讀取它的配置檔案。Apache 網路伺服器守護程序就是一個例子。 |
2 | INT | 中斷。實現和 Ctrl-c 一樣的功能,由終端傳送。通常,它會終止一個程式。 |
9 | KILL | 殺死。這個訊號很特別。儘管程式可能會選擇不同的方式來處理髮送給它的 訊號,其中也包含忽略訊號,但是 KILL 訊號從不被髮送到目標程式。而是核心立即終止 這個程序。當一個程序以這種方式終止的時候,它沒有機會去做些“清理”工作,或者是儲存工作。 因為這個原因,把 KILL 訊號看作最後一招,當其它終止訊號失敗後,再使用它。 |
15 | TERM | 終止。這是 kill 命令傳送的預設訊號。如果程式仍然“活著”,可以接受訊號,那麼這個它會終止。 |
18 | CONT | 繼續。在一個停止訊號後,這個訊號會恢復程序的執行。 |
19 | STOP | 停止。這個訊號導致程序停止執行,而不是終止。像 KILL 訊號,它不被髮送到目標程序,因此它不能被忽略。 |
eg: 通過 kill 命令傳送一個 HUP訊號,接收訊號的程式會掛起,並在終端中列印一條資訊,表示這個程序已經接收了掛起訊號。但是這條資訊可能不會立即顯示,需要多按幾次enter鍵才會顯示出來。
[email protected]:/mnt/c/Users/52840$ gedit &
[1] 754
[email protected]:/mnt/c/Users/52840$ kill -1 754
[email protected]:/mnt/c/Users/52840$
[1]+ Hangup gedit
[email protected]:/mnt/c/Users/52840$
程序,和檔案一樣,擁有所有者,所以為了能夠通過 kill 命令來給程序傳送訊號, 你必須是程序的所有者(或者是超級使用者)。
編號 | 名字 | 含義 |
---|---|---|
3 | QUIT | 退出 |
11 | SEGV | 段錯誤(Segmentation Violation)。如果一個程式非法使用記憶體,就會發送這個訊號。也就是說, 程式試圖寫入記憶體,而這個記憶體空間是不允許此程式寫入的。 |
20 | TSTP | 終端停止(Terminal Stop)。當按下 Ctrl-z 組合鍵後,終端傳送這個訊號。不像 STOP 訊號, TSTP 訊號由目標程序接收,且可能被忽略。 |
28 | WINCH | 改變視窗大小(Window Change)。當改變視窗大小時,系統會發送這個訊號。 一些程式,像 top 和 less 程式會響應這個訊號,按照新視窗的尺寸,重新整理顯示的內容。 |
通過 killall 命令給多個程序傳送訊號
通過 killall 命令,給匹配特定程式或使用者名稱的多個程序傳送訊號。語法形式為:killall -u username -signal processname...
如果不指定使用者名稱,則預設當前使用者。注意,和 kill 命令一樣,你必須擁有超級使用者許可權才能給不屬於你的程序傳送訊號。
eg:
[email protected]:/mnt/c/Users/52840$ gedit &
[1] 773
[email protected]:/mnt/c/Users/52840$ gedit &
[2] 780
[email protected]:/mnt/c/Users/52840$ killall gedit
[1]- Terminated gedit
[2]+ Done gedit
更多和程序相關的命令
監測程序是一個很重要的系統管理任務,所以有許多命令與它相關,如下表。
命令名 | 命令描述 |
---|---|
pstree | 輸出一個樹型結構的程序列表(processtree),這個列表展示了程序間父/子關係。 |
vmstat | 輸出一個系統資源使用快照,包括記憶體,交換分割槽和磁碟 I/O。 為了看到連續的顯示結果,則在命令名後加上更新操作延時的時間(以秒為單位)。例如,“vmstat 5”。 ,按下 Ctrl-c 組合鍵, 終止輸出。 |
xload | 一個圖形介面程式,可以畫出系統負載隨時間變化的圖形。 |
tload | terminal load與 xload 程式相似,但是在終端中畫出圖形。使用 Ctrl-c,來終止輸出。 |
利用shutdown命令關機或重啟
shutdown命令可以安全地關閉或重啟Linux系統,它在系統關閉之前給系統上的所有登入使用者提示一條警告資訊。shutdown通過通知init程序,要求它改換執行級別來實現。執行級別0用來關閉系統,執行級別6用來重啟系統,執行級別1用來使系統進入執行系統管理任務狀態,如果沒有給出 -h 或 -r 選項時,這是 shutdown 預設執行級別為 1。
語法格式為:shutdown -option time (自定義警告資訊)
選項 | 長選項 | 選項描述 |
---|---|---|
-h | 關機後關閉電源 | |
-r | --reboot | 重啟 |
-c | 取消執行中的shutdown程序。不能為此選項指定time引數,但是可以在命令列中輸入一條取消原因向所有使用者說明。(一般的shutdown指令可以用按“+”號來進行中斷) | |
-k | 不會真正關機,只是傳送警告資訊 | |
-f | 重啟時跳過磁碟檢測(即快速重啟) | |
-F | 重啟時強制磁碟檢測 | |
-n | 不通過 init ,快速關機。不建議用這個選項 | |
-t | 在改變到其他執行級別之前,告訴init多久後關機 |
其中,time引數是強制的,可以設定為精確的時間點關機比如:20:59,或者設定為一段時間後關機比如:+10(表示10分鐘後關機),如果想要立刻關機則可以設定為:now。
自定義的警告訊息一般在延遲關機的時候設定,比如10分鐘後關機,可以寫一條警告訊息通知所有登入的使用者:'the system will shutdown in 10 minutes'。
eg:
[email protected]:/mnt/c/Users/52840$ shundown +10 '我要在十分鐘後關機咯'
shutdown scheduled for 五 2018-10-26 13:29:38 CST,use 'shutdown -c' to cancel.