UNIX 進程管理

當你執行一個程式在UNIX系統上,該系統為該程式創建一個特殊的環境。這個環境包含系統運行的程式,如果沒有其他程式在系統上運行所需要的一切。

每當你發出命令在UNIX中,創建或啟動一個新的進程。當你嘗試了合列出目錄的內容,你啟動了一個進程。一個過程,簡單來說,就是一個正在運行的程式的一個實例。

操作系統將跟蹤進程稱為PID或進程ID通過五位ID號。該系統中的每個進程都有一個唯一的pid。

PIDS最終重複,因為所有可能的數字和未來的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。你需要瞭解作業的數量,操縱它在前臺和後之間。

如果你現在按下回車鍵,看到以下內容:

[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

其中最常用的標誌 -f ( f for 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命令顯示的所有字段的描述:

Column 描述
UID User ID that this process belongs to (the person running it).
PID Process ID.
PPID Parent process ID (the ID of the process that started it).
C CPU utilization of process.
STIME Process start time.
TTY Terminal type associated with the process
TIME CPU time taken by the process.
CMD The command that started this process.

還有其他的選擇可以一起使用ps命令:

Option 描述
-a Shows information about all users
-x Shows information about processes without terminals.
-u Shows additional information like -f option.
-e Display extended information.

停止進程:

幾種不同的方法可以做到在結束過程。通常情況下,從一個基於控制臺的命令,發送CTRL + C按鍵(默認中斷字元)將退出命令。這工作進程正在運行時在前臺模式。

如果一個進程在後臺模式下運行,那麼首先你需要得到其作業ID,使用ps命令後,你可以使用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狀態的過程。這是一具僵屍或解散過程。進程是死的,不被使用。這些過程是不同於孤立進程。它們是已完成執行的處理,但仍然有進程表中的一個條目。

守護進程:

守護進程是系統相關的後臺進程,往往根和服務請求來自其他進程的許可權運行。

守護進程沒有控制終端。它不能打開/dev/tty。如果你用“ps-ef”,並期待在tty字段中,所有的守護進程將有一個嗎? tty。

更清楚的是,僅僅是一個守護進程在後臺運行的進程,通常在等待一些事情發生,它是有能力的工作,就像一臺印表機守護進程正在等待列印命令。

如果你有一個程式需要做長期處理,那麼使其成為一個守護進程,它在後臺運行。

top命令:

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

這是一個互動的診斷工具,經常更新,並顯示物理和虛擬記憶體,CPU使用率,平均負載,以及您繁忙的的進程的資訊。

下麵是簡單的語法來運行top命令,並看到不同進程的CPU利用率的統計:

$top

作業ID與進程ID:

背景和暫停的的進程通常是通過操縱作業號(作業ID)。這個數字是不同的進程ID的使用,因為它是短暫的。

此外,作業可包含串聯或在同一時間運行,並聯的多個進程,因此,使用的作業ID是容易跟蹤單個進程。


上一篇: UNIX 管道和篩檢程式 下一篇: UNIX 網路實用工具