進程管理在系統shell提示下,使用者可以輸入各種命令來執行相應的工作。每個命令通常從終端鍵碟中獲取輸入,將輸 出打印到終端螢幕上,Unix使用標準輸入stdio和標準輸出stdout,來表示每個命令的輸入和輸出,還使用一 個標準錯誤輸出stderr用於輸出錯誤信息。這三個標準輸入輸出系統預設與終端設備相聯繫在一起,但是也可以使用管 道的概念將它們重新定向,從一個檔案或另一個命令中獲取輸入,輸出到另外的檔案中或作為另一個命令的輸入等。
FreeBSD可以同時運行多個進程,在shell下直接輸入命令十,shell將進程放到前台執行。如果要 將進程放到後台執行,需要在命令行的結尾加上一個 “&” 符號。下面的命令從後台執行,從ftp.isc. org下載檔案。
當程序已經在前台執行的時候,可以使用^Z將這個程序挂起,暫停執行。然後可以使用bg命令將這個挂起的程序 放到後台執行,或者使用fg將某個在後台或挂起的進程放到前台執行。 當在後台運行了程序的時候,可以用jobs命令來查看後台作業的狀態。在有多個後台程序時,要使用來參數的fg 命令將不同序號的後台作業切換到前台上運行。
在啟動了多個程序之後,可以使用ps命令來查看這些進程及其狀態。
顯示的結果包括進程的標識號PID,控制終端TT(p0表示控制終端為ttyp0),進程的狀態STAT,進 程使用的處理器時間TIME和具體的命令。 可以給ps命令加上參數,來獲得更多的輸出內容,以下命令將輸出系統中所有的進程:
當用戶啟動一個進程的時候,這個進程是運行在前台,使用與相應控制終端相聯繫的標準輸入、輸出進行輸入和輸出 。即使將進程的輸入輸出重定向,並將進程放在後台執行,進程仍然和目前終端設備有關系。正因為如此,在目前的登錄會話 結束時,控制終端設備將和登錄進程相脫離,那麼系統就向所有與這個終端相聯繫的進程發送SIGHUP的信號,通知進程 線路已經挂起了,如果程序沒有接管這個信號的處理,那麼預設的反應是進程結束。因此普通的程序並不能真正脫離登錄會話 而運行進程,為了使得在系統登錄後還可以正常執行,只有使用命令nohup來啟動相應程序。 從上面的ps的輸出結果可以看出,有些程序沒有控制終端,這些程序通常是一些後台進程。使用命令nohup當 然可以啟動這樣的程序,但nohup啟動的程序在進程執行完畢就退出,而常見的一些服務進程通常永久的運行在後台,不 向螢幕輸出結果。在Unix中這些永久的後台進程稱為守護進程(daemon)。守護進程通常從系統啟動時自動開始執 行,系統關閉時才停止。如果偶然某個守護進程消失了,那麼它提供的服務將不再能被使用。 在守護進程中,最重要的一個是超級守護進程inetd,這個進程接管了大部分網路服務,但並不是對每個服務都 自己進行處理,而是依據連接請求,啟動不同的服務程序與客戶機打交道。inetd支持網路服務種類在它的設置檔案 /etc/inet.conf中定義。inet.conf檔案中的每一行就對應一個端口地址,當inetd接受到連接這個 端口的連接請求時,就啟動相應的進程進行處理。使用inetd的好處是系統不必啟動很多守護進程,從而節約了系統資源 ,然而使用inetd啟動守護進程相應反應會遲緩一些,不適合用於被密集訪問的服務進程。 當用戶希望要停止一個進程時,如果進程在前台運行並接收輸入的條件下,可以輸入^D,告訴進程輸入結束,通常 這意味著需要進程進行的處理要結束了,從而通知進程結束。對於有些不以檔案輸入結束作為結束標志的進程,那麼就可以使 用^C來向進程發送信號中斷進程。 如果上述方式均無效,或者進程運行在後台或者是一個守護進程,則需要手工向進程發送信號,這可以通過kill 命令來做到。使用 “kill PID” 來向進程發送終止信號SIGTERM,這個信號告訴進程需要退出。但是這些 發送的信號都能被程序通過編程的手段捕獲並對其進行處理,一旦程序在這個處理過程中沒有退出,而是忽略這個信號的情況 下,就無法殺死進程。這時只能使用 “kill -9 PID” 向PID代表的進程發送SIGKILL信號,這個信 號不能被進程本身捕獲,從而無條件殺死進程。但是最好先首先發送SIGTERM信號終止進程。而很多守護進程能夠捕獲 SIGHUP挂線信號,會根據這個信號進行處理,例如重新讀入配置檔案,重新刷新進程本身等,因此可以再更改進程的配 置檔案之後,使用 “kill -HUP pid” 刷新進程的配置。 kill命令需要使用進程的標識號PID,因此需要首先運行ps以得到這個標識號。而FreeBSD下可以使 用程序的名字來給進程發送信號,這個命令為killall,對於大部分情況,它使用起來更為方便。
FreeBSD下提供了相當豐富的工具可以用來查看系統的狀態,使用者可以通過它們來了解系統狀態,從而優化 系統性能。這些工具通常讀取/dev/mem、/dev/kmem來獲得內存中的系統信息,使用/kernel將這些 信息中的變量轉換為名字。最基本的查看系統狀態的命令為ps,用於報告目前系統中運行的進程的狀態。 pstat能顯示系統中打開的檔案數量、交換設備的使用率等系統信息。pstat預設使用/dev/mem設 備檔案,從系統內存中讀取這些數據,或者可以指定一個core檔案,那麼pstat從這個檔案中讀取數據。還需要給pstat 一個參數來告訴pstat應該顯示那種系統信息,通常使用 “pstat -f” 顯示出目前打開檔案的列表 , “pstat -s” 顯示交換設備的目前狀態, “pstat -t” 顯示目前使用的終端設備檔案的狀態, “pstat -v” 顯示激活的v節點的目前狀態。 “pstat -T” 顯示這幾個系統表的狀態,包括目前使用 的和可以利用的系統表空間,因此可以用來檢查系統在目前負載下是使用多大的系統表,幫助進行優化系統性能。
vmstat報告核心的統計信息,包括進程、虛存、處理器、磁碟等。可以使用 “-w” 參數指定每隔幾秒時 間,報告一次系統狀態。
其他與vmstat類似的命令還有,fstat報告系統中打開檔案的信息,可以使用檔案名、進程號、用戶名, 以及指定檔案所在的檔案系統來限制要顯示的檔案。iostat報告核心的輸入輸出統計信息,包括磁碟、終端等設備的I/O 狀態。netstat報告網路的有關統計信息。nfsstat顯示NFS的統計信息。 除此之外,systat以全螢幕方式顯示各種系統統計信息,預設情況下systat是報告處理器的使用率,包 括總利用狀態、空閑使用率和各個進程的使用率。通過指定參數,systat也能進行I/O的統計、虛存的統計、網路的 統計等,這些參數包括-iostat, -vmstat, -mbufs, -netstat, -ip, -icmp, -tcp, -swap等。
除了這些系統提供的命令之外,FreeBSD也提供多種有效的系統工具,如綜合ps、systat和vmst at功能的top等。這些軟體通常可以在多種Unix系統中使用,也是十分常用的工具。也可以在FreeBSD系統中 安裝網路管理代理snmpd,然後使用網路管理系統通過網路來獲得FreeBSD主機的各種系統信息。 |