首頁 > 軟體

Linux程序管理方法介紹

2022-06-01 14:01:54

一、簡介

當我們執行程式時,Linux會為程式建立一個特殊的環境,該環境包含程式執行需要的所有資源,以保證程式能夠獨立執行,不受其他程式的干擾。這個特殊的環境就稱為程序。每個 Linux 命令都與系統中的程式對應,輸入命令,Linux 就會建立一個新的程序。例如使用 ls 命令遍歷目錄中的檔案時,就建立了一個程序。簡而言之,程序就是程式的範例。 
系統通過一個五位數位跟蹤程式的執行狀態,這個數位稱為 pid 或程序ID。每個程序都擁有唯一的 pid。 
理論上,五位數位是有限的,當數位被用完時,下一個 pid 就會重新開始,所以 pid 最終會重複。但是,兩個 pid 一樣的程序不能同時存在,因為Linux會使用 pid 來跟蹤程式的執行狀態。

二、建立程序

有兩種方式來建立程序:前臺程序後臺程序

1、前臺程序

預設情況下,使用者建立的程序都是前臺程序;前臺程序從鍵盤讀取資料,並把處理結果輸出到顯示器。 
我們可以看到前臺程序的執行過程。例如,使用 ls 命令來遍歷當前目錄下的檔案:

$ls ch*.doc
ch01-1.doc   ch010.doc  ch02.doc    ch03-2.doc
ch04-1.doc   ch040.doc  ch05.doc

這個程式就執行在前臺,它會直接把結果輸出到顯示器。如果 ls 命令需要資料(實際上不需要),那麼它會等待使用者從鍵盤輸入。

當程式執行在前臺時,由於命令提示字元($)還未出現,使用者不能輸入其他命令;即使程式需要執行很長時間,也必須等待程式執行結束才能輸入其他命令。

2、後臺程序

後臺程序與鍵盤沒有必然的關係。當然,後臺程序也可能會等待鍵盤輸入。 
後臺程序的優點不必等待程式執行結束就可以輸入其他命令。 
建立後臺程序最簡單的方式就是在命令的末尾加 &,例如:

$ls ch*.doc &
ch01-1.doc   ch010.doc  ch02.doc    ch03-2.doc
ch04-1.doc   ch040.doc  ch05.doc    ch06-2.doc
ch01-2.doc   ch02-1.doc

如果 ls 命令需要輸入(實際上不需要),那麼它會暫停,直到使用者把它調到前臺並從鍵盤輸入資料才會繼續執行。

三、檢視正在執行的程序

可以使用 ps 命令檢視程序的執行狀態,包括後臺程序,例如:

$ps
PID       TTY      TIME        CMD
18358     ttyp3    00:00:00    sh
18361     ttyp3    00:01:31    abiword
18789     ttyp3    00:00:00    ps

還可以結合 -f 選項檢視更多資訊,f 是 full 的縮寫,例如:

$ps -f
UID      PID  PPID C STIME    TTY   TIME CMD
amrood   6738 3662 0 10:23:03 pts/6 0:00 first_one
amrood   6739 3662 0 10:22:54 pts/6 0:00 second_one
amrood   3662 3657 0 08:10:53 pts/6 0:00 -ksh
amrood   6892 3662 4 10:51:50 pts/6 0:00 ps -f

每列的含義如下:

  • UID:程序所屬使用者的ID,即哪個使用者建立了該程序。
  • PID:程序ID。
  • PPID:父程序ID,建立該程序的程序稱為父程序。
  • C:CPU使用率。
  • STIME:程序被建立的時間。
  • TTY:與程序有關的終端型別。
  • TIME:程序所使用的CPU時間。
  • CMD:建立該程序的命令。

ps 命令還有其他一些選項:

  • -a:顯示所有使用者的所有程序。
  • -x:顯示無終端的程序。
  • -u:顯示更多資訊,類似於 -f 選項。
  • -e:顯示所有程序。

四、終止程序

程序執行在前臺時,可以通過 kill 命令或 Ctrl+C 組合鍵來結束程序。 
如果程序執行在後臺,那麼首先要通過 ps 命令來獲取程序ID,然後使用 kill 命令“殺死”程序,例如:

$ps -f
UID      PID  PPID C STIME    TTY   TIME CMD
amrood   6738 3662 0 10:23:03 pts/6 0:00 first_one
amrood   6739 3662 0 10:22:54 pts/6 0:00 second_one
amrood   3662 3657 0 08:10:53 pts/6 0:00 -ksh
amrood   6892 3662 4 10:51:50 pts/6 0:00 ps -f
$kill 6738
Terminated

如上所示,kill 命令終結了 first_one 程序。

如果程序忽略 kill 命令,那麼可以通過 kill -9 來結束:

$kill -9 6738
Terminated

1.命令格式

kill[引數][程序號]

2.命令功能

傳送指定的訊號到相應程序。不指定型號將傳送SIGTERM(15)終止指定程序。如果任無法終止該程式可用“-KILL” 引數,其傳送的訊號為SIGKILL(9) ,將強制結束程序,使用ps命令或者jobs 命令可以檢視程序號。root使用者將影響使用者的程序,非root使用者只能影響自己的程序。

3.命令引數:

  • -l 訊號,若果不加訊號的編號引數,則使用“-l”引數會列出全部的訊號名稱
  • -a 當處理當前程序時,不限制命令名和程序號的對應關係
  • -p 指定kill 命令只列印相關程序的程序號,而不傳送任何訊號
  • -s 指定傳送訊號
  • -u 指定使用者

注意:

  • kill命令可以帶訊號號碼選項,也可以不帶。如果沒有訊號號碼,kill命令就會發出終止訊號(15),這個訊號可以被程序捕獲,使得程序在退出之前可以清理並釋放資源。也可以用kill向程序傳送特定的訊號。例如: 
    kill -2 123 
    它的效果等同於在前臺執行PID為123的程序時按下Ctrl+C鍵。但是,普通使用者只能使用不帶signal引數的kill命令或最多使用-9訊號。
  • kill可以帶有程序ID號作為引數。當用kill向這些程序傳送訊號時,必須是這些程序的主人。如果試圖復原一個沒有許可權復原的程序或復原一個不存在的程序,就會得到一個錯誤資訊。
  • 可以向多個程序發訊號或終止它們。
  • 當kill成功地傳送了訊號後,shell會在螢幕上顯示出程序的終止資訊。有時這個資訊不會馬上顯示,只有當按下Enter鍵使shell的命令提示字元再次出現時,才會顯示出來。
  • 應注意,訊號使程序強行終止,這常會帶來一些副作用,如資料丟失或者終端無法恢復到正常狀態。傳送訊號時必須小心,只有在萬不得已時,才用kill訊號(9),因為程序不能首先捕獲它。要復原所有的後臺作業,可以輸入kill 0。因為有些在後臺執行的命令會啟動多個程序,跟蹤並找到所有要殺掉的程序的PID是件很麻煩的事。這時,使用kill 0來終止所有由當前shell啟動的程序,是個有效的方法。

訊號說明

只有第9種訊號(SIGKILL)才可以無條件終止程序,其他訊號程序都有權利忽略。 下面是常用的訊號:

  • HUP 1 終端斷線
  • INT 2 中斷(同 Ctrl + C)
  • QUIT 3 退出(同 Ctrl + )
  • TERM 15 終止
  • KILL 9 強制終止
  • CONT 18 繼續(與STOP相反, fg/bg命令)
  • STOP 19 暫停(同 Ctrl + Z)

五、父程序和子程序

每個 Linux 程序會包含兩個程序ID:當前程序ID(pid)和父程序ID(ppid)。可以暫時認為所有的程序都有父程序。 
由使用者執行的大部分命令都將 Shell 作為父程序,使用 ps -f 命令可以檢視當前程序ID和父程序ID。

六、殭屍程序和孤兒程序

正常情況下,子程序被終止時會通過 SIGCHLD 訊號通知父程序,父程序可以做一些清理工作或者重新啟動一個新的程序。但在某些情況下,父程序會在子程序之前被終止,那麼這些子程序就沒有了“父親”,被稱為孤兒程序。 
init 程序會成為所有孤兒程序的父程序。init 的 pid 為1,是Linux系統的第一個程序,也是所有程序的父程序。 
如果一個程序被終止了,但是使用 ps 命令仍然可以檢視該程序,並且狀態為 Z,那麼這就是一個殭屍程序。殭屍程序雖然被終止了,但是仍然存在於程序列表中。一般殭屍程序很難殺掉,你可以先殺死他們的父程序,讓他們變成孤兒程序,init 程序會自動清理殭屍程序。

七、常駐程序

常駐程序一般是系統級程序,以 root 許可權執行在後臺,可以處理其他程序的請求。 
常駐程序沒有終端,不能存取 /dev/tty 檔案,如果使用 ps -ef 檢視該程序,tty 這一列會顯示問號(?)。 
更確切地說,常駐程序通常執行在後臺,等待指定事件發生,例如列印程序是一個常駐程序,它會等待使用者輸入列印相關的命令並進行處理。

八、top命令

top 命令是一個很有用的工具,它可以動態顯示正在執行的程序,還可以按照指定條件對程序進行排序,與Windows的工作管理員類似。 
top 命令可以顯示程序的很多資訊,包括實體記憶體、虛擬記憶體、CPU使用率、平均負載以及繁忙的程序等。例如:

$top

九、任務和程序

任務(task)是最抽象的,是一個一般性的術語,指由軟體完成的一個活動。一個任務既可以是一個程序,也可以是多個程序。簡而言之,它指的是一系列共同達到某一目的的操作。例如,讀取資料並將資料放入記憶體中。這個任務可以由一個程序來實現,也可以由多個程序來實現。 每個任務都有一個數位表示的任務號。

程序(process)常常被定義為程式的執行。可以把一個程序看成是一個獨立的程式,在記憶體中有其完備的資料空間和程式碼空間。一個程序所擁有的資料和變數只屬於它自己。

jobs 命令可以用來檢視系統中正在執行的任務,包括後臺執行的任務。該命令可以顯示任務號及其對應的程序ID。一個任務可以對應於一個或者多個程序號。 
jobs 命令的 -l 選項可以檢視當前任務包含的程序ID:

$jobs -l
[1] + 1903 running                 ls ch*.doc &
$

其中,第一列表示任務號,第二列表示任務對應的程序ID,第三列表示任務的執行狀態,第四列表示啟動任務的命令。

十、前臺任務和後臺任務的切換

1、fg 命令可以將後臺任務調到前臺,語法為:

$fg %jobnumber

jobnumber 是通過 jobs 命令獲取的後臺任務的的序號,注意不是pid。如果後臺只有一個任務,可以不指定 jobnumber。

2、bg 命令可以將後臺暫停的任務,調到前臺繼續執行,語法為:

$bg %jobnumber

jobnumber 同樣是通過 jobs 命令獲取的後臺任務的的序號,注意不是pid。如果前臺只有一個任務,可以不指定 jobnumber。 
如果希望將當前任務轉移到後臺,可以先 Ctrl+z 暫停任務,再使用 bg 命令。任務轉移到後臺可以空出終端,繼續輸入其他命令。

到此這篇關於Linux程序管理的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com