
- Unix/Linux 初學者教程
- Unix/Linux - 首頁
- Unix/Linux - 什麼是Linux?
- Unix/Linux - 入門指南
- Unix/Linux - 檔案管理
- Unix/Linux - 目錄
- Unix/Linux - 檔案許可權
- Unix/Linux - 環境變數
- Unix/Linux - 基本實用程式
- Unix/Linux - 管道與過濾器
- Unix/Linux - 程序
- Unix/Linux - 通訊
- Unix/Linux - vi 編輯器
- Unix/Linux Shell 程式設計
- Unix/Linux - Shell 指令碼
- Unix/Linux - 什麼是Shell?
- Unix/Linux - 使用變數
- Unix/Linux - 特殊變數
- Unix/Linux - 使用陣列
- Unix/Linux - 基本運算子
- Unix/Linux - 決策語句
- Unix/Linux - Shell 迴圈
- Unix/Linux - 迴圈控制
- Unix/Linux - Shell 替換
- Unix/Linux - 引號機制
- Unix/Linux - I/O 重定向
- Unix/Linux - Shell 函式
- Unix/Linux - 手冊頁幫助
- 高階 Unix/Linux
- Unix/Linux - 標準 I/O 流
- Unix/Linux - 檔案連結
- Unix/Linux - 正則表示式
- Unix/Linux - 檔案系統基礎
- Unix/Linux - 使用者管理
- Unix/Linux - 系統性能
- Unix/Linux - 系統日誌
- Unix/Linux - 訊號和陷阱
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 比跟蹤單個程序更容易。