Unix/Linux - 程序管理



本章將詳細討論 Unix 中的程序管理。當您在 Unix 系統上執行程式時,系統會為該程式建立一個特殊的環境。此環境包含系統執行程式所需的一切,就好像系統上沒有執行其他程式一樣。

無論何時您在 Unix 中發出命令,它都會建立或啟動一個新程序。當您嘗試使用 **ls** 命令列出目錄內容時,您就啟動了一個程序。簡單來說,程序就是正在執行的程式的一個例項。

作業系統透過一個五位數的 ID 號來跟蹤程序,這個 ID 號稱為 **pid** 或 **程序 ID**。系統中的每個程序都有一個唯一的 **pid**。

由於所有可能的數字都被用完,下一個 pid 會迴圈或重新開始,因此 pid 最終會重複。在任何時間點,系統中都不存在兩個具有相同 pid 的程序,因為 Unix 使用 pid 來跟蹤每個程序。

啟動程序

啟動程序(執行命令)有兩種方式:

  • 前臺程序
  • 後臺程序

前臺程序

預設情況下,您啟動的每個程序都在前臺執行。它從鍵盤獲取輸入,並將輸出傳送到螢幕。

您可以看到 **ls** 命令是如何工作的。如果您想列出當前目錄中的所有檔案,可以使用以下命令:

$ls ch*.doc

這將顯示所有名稱以 **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** 命令需要任何輸入(它不需要),它會從鍵盤等待輸入。

當程式在前臺執行且耗時時,無法執行其他命令(啟動任何其他程序),因為在程式完成處理並退出之前,提示符將不可用。

後臺程序

後臺程序在不連線到鍵盤的情況下執行。如果後臺程序需要任何鍵盤輸入,它會等待。

在後臺執行程序的優點是您可以執行其他命令;您不必等到它完成才能啟動另一個命令!

啟動後臺程序最簡單的方法是在命令末尾新增一個與號(**&**)。

$ls ch*.doc &

這將顯示所有名稱以 **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** 命令需要任何輸入(它不需要),它會進入停止狀態,直到我們將其移到前臺並從鍵盤提供資料。

第一行包含有關後臺程序的資訊 - 作業編號和程序 ID。您需要知道作業編號才能在後臺和前臺之間操作它。

按 Enter 鍵,您將看到以下內容:

[1]   +   Done                 ls ch*.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

**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

以下是 **ps -f** 命令顯示的所有欄位的描述:

序號 列 & 描述
1

UID

此程序所屬的使用者 ID(執行它的人)

2

PID

程序 ID

3

PPID

父程序 ID(啟動它的程序的 ID)

4

C

程序的 CPU 利用率

5

STIME

程序啟動時間

6

TTY

與程序關聯的終端型別

7

TIME

程序佔用的 CPU 時間

8

CMD

啟動此程序的命令

還可以與 **ps** 命令一起使用其他選項:

序號 選項 & 描述
1

-a

顯示所有使用者的資訊

2

-x

顯示沒有終端的程序的資訊

3

-u

顯示更多資訊,如 -f 選項

4

-e

顯示擴充套件資訊

停止程序

結束程序可以通過幾種不同的方式完成。通常,從基於控制檯的命令中,傳送 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** 後跟程序 ID,如下所示:

$kill -9 6738
Terminated

父程序和子程序

每個 Unix 程序都有兩個分配給它的 ID 號:程序 ID (pid) 和父程序 ID (ppid)。系統中的每個使用者程序都有一個父程序。

您執行的大多數命令都以 shell 作為其父程序。檢視 **ps -f** 示例,其中此命令列出了程序 ID 和父程序 ID。

殭屍程序和孤兒程序

通常,當子程序被殺死時,父程序會透過 **SIGCHLD** 訊號更新。然後父程序可以執行其他任務或根據需要重新啟動一個新的子程序。但是,有時父程序在其子程序被殺死之前就被殺死了。在這種情況下,“所有程序的父程序”,**init** 程序,成為新的 PPID(父程序 ID)。在某些情況下,這些程序稱為孤兒程序。

當程序被殺死時,**ps** 列表可能仍然顯示該程序處於 **Z** 狀態。這是一個殭屍程序或失效程序。程序已死且未使用。這些程序與孤兒程序不同。它們已完成執行,但仍在程序表中找到條目。

守護程序

守護程序是與系統相關的後臺程序,通常以 root 許可權執行並響應其他程序的服務請求。

守護程序沒有控制終端。它無法開啟 ** /dev/tty**。如果您執行 **"ps -ef"** 並檢視 **tty** 欄位,所有守護程序的 **tty** 都將為 **?**。

準確地說,守護程序是在後臺執行的程序,通常等待它能夠處理的事情發生。例如,等待列印命令的印表機守護程序。

如果您有一個需要長時間處理的程式,那麼將其製作成守護程序並在後臺執行它將很有價值。

top 命令

**top** 命令是一個非常有用的工具,可以快速顯示按各種標準排序的程序。

它是一個互動式診斷工具,可以頻繁更新並顯示有關物理和虛擬記憶體、CPU 使用率、負載平均值和繁忙程序的資訊。

以下是執行 top 命令並檢視不同程序的 CPU 利用率統計資訊的簡單語法:

$top

作業 ID 與程序 ID

後臺和掛起程序通常透過 **作業編號(作業 ID)** 進行操作。此編號與程序 ID 不同,因為它更短。

此外,作業可以由多個程序組成,這些程序可以序列或並行執行。使用作業 ID 比跟蹤單個程序更容易。

廣告