1. 程式人生 > >Linux之程式管理

Linux之程式管理

目錄

1.什麼是程序(Process)?

  • 直觀點說,儲存在硬碟上的程式執行以後,會在記憶體空間裡形成一個獨立的記憶體體,這個記憶體體有自己的地址空間,有自己的堆,上級掛靠單位是作業系統。作業系統會以程序為單位,分配系統資源,所以我們也說,程序是資源分配的最小單位。
  • Linux的程序相互之間有一定的關係。比如說,在Linux程序基礎中,我們看到,每個程序都有父程序,而所有的程序以init程序為根,形成一個樹狀結構。我們在這裡講解程序組和會話,以便以更加豐富的方式了管理程序。
  • 程序是一個程式的動態執行例項
  • 一個正在執行的程式
  • 能分配處理器並由處理器執行的實體
  • 核心觀點:擔當分配系統資源(CPU時間,記憶體)的實體。
  • 程序的兩個基本元素是程式程式碼和程式碼相關聯的資料集。程序是一種動態描述,但並不代表所有的程序都在執行。(程序在記憶體中因策略或排程需求會處於各種狀態)

1.1.什麼是程式?

在 Linux 系統當中:『觸發任何一個事件時,系統都會將他定義成為一個程式,並且給這個程式一個 ID ,稱為 PID,同時依據啟動這個程式的使用者與相關屬性關係,給予這個 PID 一組有效的許可權設定。 以後,這個 PID 能夠在系統上面進行的動作,就與這個 PID 的許可權有關了。

1.2.程序與程式的區別與聯絡

  • 程序是程式的一次動態執行例項,程式是可以被儲存的,而程序只是暫時的。即程序是動態的概念,程式是靜態的概念
  • 程式只是檔案,它是一系列程式碼指令的集合,而程序是程式被載入到記憶體,並衍生出一系列的結構體來維護

1.3.Linux是多人、多工環境

在 Linux 底下執行一個指令時,系統會將相關癿許可權、屬性、程式程式碼與資料等均載入記憶體, 並給這個單元一個程式識別符號 (PID),最終該指令可以進行的任務則與這個 PID 的許可權有關。

  • 多人環境

在同一時間內,可以有多個使用者同時登陸一個系統。

  • 多工環境

同時可以執行多個程序,比如同時開啟qq和音樂播放器。

2.工作管理 (job control)

工作管理 (job control) 是用在 bash 環境下的,當我們登入系統取得 bash shell 之後,在單一終端機介面下同時進行多個工作的行為管理 。舉例來說,我們在登入 bash 後, 想要一邊複製檔案、一邊進行資料搜尋、一邊進行編譯,還可以一邊進行 vi 程式撰寫! 當然我們可以重複登入那六個文字介面的終端機環境中,不過,能不能在一個 bash 內達成? 當然可以啊!就是使用 job
control。

命令小結:

命令小結
CTRL + C 終止一個程式的執行
CTRL + Z 暫停一個程式的執行,並把它放在後臺
jobs 檢視後臺程式已經執行狀態
bg 讓後臺暫停的程式,變成執行狀態,例子:執行暫停態序號為1的程式,使用命令:bg 1
fg 將背景工作拿到前景來處理
指令 & 直接將指令丟到背景中『執行』
kill 管理背景當中的工作
ps aux 觀察系統所有的程式資料

例子:

當我們在終端中開啟一個軟體,例如:firefox(火狐瀏覽器)

這時候我們再使用命令的時候,終端就不會響應了,因為此時前臺已經firefox瀏覽器被佔用了。

此時使用命令:CTRL + C ,終止這個firefox程式的執行,前臺又可以使用了。

再次執行firefox程式,然後使用CTRL+Z,暫停這個程式的執行,前臺仍然可以保留出來,但是firefox軟體在後臺就停止運行了,除了暫停的狀態。

firefox程式無響應

 2.1.jobs命令

命令: jobs

語法:jobs [-lrs]

選項引數

選項 含義
-l 除了列出job number 與指令串之外,同時列出PID號碼
-r 僅列出正在後臺run的工作
-s 僅列出正在後臺中停止(stop)的工作。

檢視後臺的程式有哪些,以及程式的狀態,使用命令:jobs

解釋:此處顯示只有一個暫停的程式,名為firefox,序列號為1

如何啟用後臺停止的程式,使用命令:bg + 暫停態序列號

例如:啟動一個序列號為1的程式,使用jobs命令可以看到後臺的firefox程式已經處於執行態了:

現在firefox是執行在後臺的,如何把它調到前臺來呢,使用明明:fg + 序列號

2.2.執行一個程式的時候直接放在後臺執行

在執行這個程式的時候直直接在其後面加一個“&”符號,例如,讓firefox軟體執行在後臺,使用命令:firefox &

解釋:此時前臺的程式可以正常執行,後臺的firefox程式也在執行

2.3.管理背景當中的工作: kill

命令:kill

語法:kill -signal %jobnumber

選項:
 

選項 含義
-l

列出目前 kill能夠使用的訊號(signal)有哪些

signal:代表給予後面接的那個工作什麼樣的指示,使用命令man 7 signal 可查詢

-1 重新讀取一次引數的配置檔案
-2 代表由鍵盤輸入ctrl -c 同樣的工作
-9 立刻強制刪除一個動作
-15 以正常的程式方式終止一項工作,不同於-9

例子:殺掉後臺jobnumber為1的那個程式。

使用命令:kill -9 %1

注意:如果上面的命令沒有了這個符號"%",就代表是殺死程序PID為1的那個程序,而不是程式。

注意事項:

即使讓一個程式在後臺執行,但是如果後臺有資料輸出,這個資料還是顯示在前臺的螢幕上的,例子演示一下

使用命令:ping localhost & ,使這個命令在後臺輸出

3.程式的觀察

3.1.ps 命令

功能:將某個時間點的程式運作情況擷取下來

選項與引數

引數 含義
-A 所有的process均顯示出來,與-e相同的效果
-a 不與terminal有關的所有process
-u 有效使用者(effective user)相關的peocess
-x 通常與a這個引數一起使用,可列出較完整的資訊
輸出格式規劃:
l 較長、較詳細的將該PID的資訊列出
j 工作的格式(jobs format)
-f 做一個更為完整的輸出

例子:

ps aux:觀察系統所有的程式資料

ps -lA :能夠觀察所有系統的資料

ps axjf:連同部分程式樹狀態

3.2.僅觀察自己的 bash 相關程式: ps -l 

各段的含義

  •   F:代表這個程式旗標 (process flags),說明這個程式的總結許可權,常見號碼有:

 o 若為 4 表示此程式的許可權為 root ;

 o 若為 1 則表示此子程式僅進行復制(fork)而沒有實際執行(exec)。

  • S:代表這個程式的狀忞 (STAT),主要的狀態有:

o  R (Running):該程式正在運作中;
o  S (Sleep):開程式目前正在睡眠狀態(idle),但可以被喚醒(signal)。
o  D :不可被喚醒的睡眠狀忞,通常這支程式可能在等待 I/O 的情況(ex>列印)
o  T :停止狀忞(stop),可能是在工作控制(背景暫停)或除錯 (traced) 狀忞;
o  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 的縮寫,觸發此程式的命令。

解釋:bash程式

bash 的程式屬於 UID 為 0 的使用者,狀態為睡眠(sleep), 所以為睡眠狀態因為觸發了 ps (狀態為 run) 。此程式的 PID 為 15142,優先執行頇序為 80, 下達 bash 所取得的終端介面為 pts/0 ,運作狀態為等待 (wait) 。

3.3.觀察系統所有程式: ps aux

使用命令:ps aux

各段的含義:

  •  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:該程式的實際指令為何

一般來說,ps aux命令的顯示結果會按照PID的大小來顯示,還是找到PID為15412哪個PID來解釋一下那段資料的含義:

佔用了0.5%的實體記憶體百分比,狀態為休眠(Ss),程式的啟動時間為20:58,且取得終端機環境pts/0.

3.4.離線管理問題:nohup

要注意癿是,我們在工作管理當中提到的『背景』指的是在終端機模式下可以避克 [crtl]-c 中斷的一個情境, 並不是放到系統的背景去!所以,工作管理的背景依舊與終端機有關! 在這樣的情況冴下,如果你是以程序聯機方式連線到你的 Linux 主機,並且將工作以 & 的方式放到背景去, 請問,在工作尚未結束的情況下你離線了,該工作還會繼續進行嗎?答案是『否』!不會繼續進行,而是會被中斷掉。

以嘗試使用 nohup 這個指令來處理喔!這個 nohup 可以使你在離線或登出系統後,還能夠使工作繼續進行。

語法:

 nohup [指令與引數]       <==在終端機前景中工作

 nohup [指令與引數] &   <==在終端機背景中工作

功能:即使你關閉執行程式的控制檯,這個程式仍然會執行。

3.5.動態觀察程式的變化:top

相對於 ps 是擷取一個時間點的程式狀態, top 則可以持續偵測程式運作的狀忞!使用方式如下:

語法:

top [-d 數字] | top [-bnp]

引數

指令 含義
-d 後面可以接秒數,就是整個程式畫面更新的秒數,預設是5s
-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 軟體的按鍵。

使用top命令可以實時檢視程序的變化,預設是5s變化一次:

 

改變重新整理的時間為1s

使用命令:top -d 1

現在重新整理速度是1s一次。

4.程式的管理

程式之間是可以互相控制的!舉例來說,你可以關閉、重新啟動伺服器軟體,朋務器軟體本身是個程式, 你既然可以使它關閉或啟動,當然就是可以控制該程式啦!那麼程式是如何互相管理的呢?其實是透過給予該程式一個訊號 (signal) 去告知該程式你想要它做什麼!

4.1.kill -signal PID

例子:殺死ping這個程序,例如這個程序的PID是15423

使用命令:kill -9 15423

如何檢視一個程序或指令的PID?

使用命令:pidof 指令

例如檢視ping的pid,使用命令:pidof ping 

4.2.killall -signal 指令名稱

由於 kill 後面必項要加上 PID 或者是( job number),所以,通常 kill 都會配合 ps, pstree 指令挃令,因為我們必項要找到相對應的那個程式的 ID 嘛!但是,如此一來,很麻煩~有沒有可以利用『下達指令的名稱』來給予這個訊號的。

那麼就是這條指令啦:killall -signal 指令名稱

語法:

killall [-iIe] [command name]

選項

選項 含義
-i interactive 的意忠,互動式的,若需要刪除時,會出現提示字元給使用者
-e exact 的意思,表示『後面接的 command name 要一致』,但整個完整的指令不能超過 15 個字元
-I 指令名稱(可能含引數)忽略大小寫

例子:殺死ping這個程序

使用命令:killall -9 ping

4.3.程序的執行順序

我們知道 Linux 是多人多工的環境,由 top 的輸出結果我們也發現, 系統同時間有非常多的程式在執行中,叧是絕大部分的程式都在休眠 (sleeping) 狀態而已。 想一想,如果所有的程式同時被喚醒,那麼 CPU 應該要先處理那個程式呢?

  • Priority與 Nice 值

由於 PRI 是核心動態調整的,我們使用者也無權去幹涉 PRI !那如果你想要調整程式的優先執行序時,就得要透過 Nice 值了!Nice 值就是上表的 NI 啦!一般來說, PRI 與 NI 的相關性如下:

     PRI(new) = PRI(old) + nice

注意:如果原本的 PRI 是 50 ,並不是我們給予一個 nice = 5 ,就會使 PRI 變成 55! 因為 PRI 是系統『動態』決定的,所以,雖然 nice 值是可以影響 PRI ,不過, 最終的 PRI 仍是要經過系統分析後才會決定的。另外, nice 值是有正負的喔,而既然 PRI 越小越早被執行, 所以,當nice 值為負值時,那麼該程式就會降低 PRI 值,這個程序的優先順序就越高。

  •  nice 值可調整的範圍為 -20 ~ 19 ;
  •  root 可隨意調整自己或他人程式的 Nice 值,其範圍為 -20 ~ 19 ;
  •  一般使用者僅可調整自己程式的 Nice 值,其範圍僅為 0 ~ 19 (避免一般使用者搶佔系統資源);
  •  一般使用者僅可將 nice 值越調越高,例如本來 nice 為 5 ,則未來僅能調整到大於 5
  • nice :新執行的指令即給予新的 nice 值

語法:

nice [-n 數字] command

選項:

-n :後面接一個數值,數值癿範圍 -20 ~ 19

例子:

用 root 給一個 nice 植為 -5 ,用於執行 vi ,並觀察該程式!

  •   renice :已存在程式的 nice 重新調整

語法:

renice [number] PID

選項:PID :某個程式的 ID 

例子:

找出自己的 bash PID ,並將該 PID 的 nice 調整到 10

同樣可以使用top命令裡面使用指令去修改。

4.4.系統資源的觀察

  • free :觀察記憶體使用情況

語法:

free [-b|-k|-m|-g] [-t]

選項與引數

選項 含義
-b 直接輸入 free 時,顯示的單位是 Kbytes,我們可以使b(bytes),m(Mbytes)、k(Kbytes), 及 g(Gbytes) 來顯示單位!
-t 在輸出的最終結果,顯示實體記憶體與 swap 的總量

l

例子:

  • uname:查閱系統與核心相關資訊

​​​​​​​語法

uname [-asrmpi]

選項與引數

選項 引數
-a 所有系統相關的資訊,包括底下的資料都會被列出來;
-s 系統核心名稱
-r 核心的版本
-m 本系統的硬體名稱,例如 i686 或者 x86_64 等;
-p CPU 的型別,與 -m 類似,叧是顯示的是 CPU的型別!
-i 硬體的平臺 (ix86)

例子:

使用命令:uname -a

  • uptime:觀察系統啟動時間與工作負載

​​​​​​​例子:

使用命令:uptime