FreeBSD連載(24):查看系統狀態

1999年11月26日 16:10 王波

進程管理

  在系統shell提示下,使用者可以輸入各種命令來執行相應的工作。每個命令通常從終端鍵碟中獲取輸入,將輸 出打印到終端螢幕上,Unix使用標準輸入stdio和標準輸出stdout,來表示每個命令的輸入和輸出,還使用一 個標準錯誤輸出stderr用於輸出錯誤信息。這三個標準輸入輸出系統預設與終端設備相聯繫在一起,但是也可以使用管 道的概念將它們重新定向,從一個檔案或另一個命令中獲取輸入,輸出到另外的檔案中或作為另一個命令的輸入等。

$ ls > ls.out

$ cat < ls.out
$ ls -l | grep mbox

  FreeBSD可以同時運行多個進程,在shell下直接輸入命令十,shell將進程放到前台執行。如果要 將進程放到後台執行,需要在命令行的結尾加上一個 “&” 符號。下面的命令從後台執行,從ftp.isc. org下載檔案。

$ wget  ftp://ftp.isc.org/pub/inn/inn-1.7.2.tar.gz  &

  當程序已經在前台執行的時候,可以使用^Z將這個程序挂起,暫停執行。然後可以使用bg命令將這個挂起的程序 放到後台執行,或者使用fg將某個在後台或挂起的進程放到前台執行。

  當在後台運行了程序的時候,可以用jobs命令來查看後台作業的狀態。在有多個後台程序時,要使用來參數的fg 命令將不同序號的後台作業切換到前台上運行。

$ jobs


[1]+ Running wget ftp://ftp.isc.org/pub/inn/inn-1.7.2.tar.gz &
$ fg %1
wget ftp://ftp.isc.org/pub/inn/inn-1.7.2.tar.gz

  在啟動了多個程序之後,可以使用ps命令來查看這些進程及其狀態。

$ ps

PID TT STAT TIME COMMAND
501 p2 Ss 0:00.24 -bash (bash)
988 p2 R+ 0:00.00 ps
765 p3 Is+ 0:00.28 -bash (bash)
230 v0 Is+ 0:00.14 -bash (bash)

  顯示的結果包括進程的標識號PID,控制終端TT(p0表示控制終端為ttyp0),進程的狀態STAT,進 程使用的處理器時間TIME和具體的命令。

  可以給ps命令加上參數,來獲得更多的輸出內容,以下命令將輸出系統中所有的進程:

$ ps waux

USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
wb 989 0.0 0.4 400 236 p2 R+ 5:48PM 0:00.00 ps -aux
root 1 0.0 0.1 496 72 ?? Is 10:12PM 0:00.02 /sbin/init --
root 2 0.0 0.0 0 0 ?? DL 10:12PM 0:07.05 (pagedaemon)
root 3 0.0 0.0 0 0 ?? DL 10:12PM 0:00.20 (vmdaemon)
root 4 0.0 0.0 0 0 ?? DL 10:12PM 0:04.27 (syncer)
root 27 0.0 0.0 204 0 ?? IWs - 0:00.00 (adjkerntz)
root 91 0.0 0.5 820 328 ?? Is 2:12PM 0:00.82 syslogd
daemon 100 0.0 0.0 792 0 ?? IWs - 0:00.00 (portmap)
root 131 0.0 0.3 864 164 ?? Is 2:12PM 0:00.06 inetd
root 134 0.0 0.3 980 192 ?? Is 2:12PM 0:00.11 cron
root 138 0.0 0.6 1252 380 ?? Is 2:12PM 0:00.11 sendmail: accepti
wb 230 0.0 1.1 1540 668 v0 Is+ 2:12PM 0:00.14 -bash (bash)
root 231 0.0 0.0 824 0 v1 IWs+ - 0:00.00 (getty)
root 232 0.0 0.0 824 0 v2 IWs+ - 0:00.00 (getty)
root 500 0.0 0.9 876 524 ?? Ss 4:19PM 0:01.78 telnetd
wb 501 0.0 1.4 1540 888 p2 Ss 4:19PM 0:00.24 -bash (bash)
root 698 0.0 1.5 1644 900 ?? Is 4:49PM 0:00.02 /usr/local/sbin/s
root 700 0.0 1.2 1308 748 ?? Ss 4:49PM 0:00.22 /usr/local/sbin/n
root 702 0.0 3.4 2900 2112 ?? S 4:49PM 0:00.32 /usr/local/sbin/s
root 764 0.0 0.9 880 540 ?? Is 5:10PM 0:00.22 telnetd
wb 765 0.0 1.7 1536 1052 p3 Is+ 5:10PM 0:00.28 -bash (bash)
root 0 0.0 0.0 0 0 ?? DLs 10:12PM 0:00.02 (swapper)

  當用戶啟動一個進程的時候,這個進程是運行在前台,使用與相應控制終端相聯繫的標準輸入、輸出進行輸入和輸出 。即使將進程的輸入輸出重定向,並將進程放在後台執行,進程仍然和目前終端設備有關系。正因為如此,在目前的登錄會話 結束時,控制終端設備將和登錄進程相脫離,那麼系統就向所有與這個終端相聯繫的進程發送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” 顯示這幾個系統表的狀態,包括目前使用 的和可以利用的系統表空間,因此可以用來檢查系統在目前負載下是使用多大的系統表,幫助進行優化系統性能。

$ pstat -T

69/8232 files
4M/137M swap space

  vmstat報告核心的統計信息,包括進程、虛存、處理器、磁碟等。可以使用 “-w” 參數指定每隔幾秒時 間,報告一次系統狀態。

$ vmstat


procs memory page disks faults cpu
r b w avm fre flt re pi po fr sr wd0 wd1 fd0 in sy cs us sy id
0 0 0 3752 30476 643 0 0 0 19 43 0 0 0 262 2599 85 56 3 41

  其他與vmstat類似的命令還有,fstat報告系統中打開檔案的信息,可以使用檔案名、進程號、用戶名, 以及指定檔案所在的檔案系統來限制要顯示的檔案。iostat報告核心的輸入輸出統計信息,包括磁碟、終端等設備的I/O 狀態。netstat報告網路的有關統計信息。nfsstat顯示NFS的統計信息。

  除此之外,systat以全螢幕方式顯示各種系統統計信息,預設情況下systat是報告處理器的使用率,包 括總利用狀態、空閑使用率和各個進程的使用率。通過指定參數,systat也能進行I/O的統計、虛存的統計、網路的 統計等,這些參數包括-iostat, -vmstat, -mbufs, -netstat, -ip, -icmp, -tcp, -swap等。

        /0   /1   /2   /3   /4   /5   /6   /7   /8   /9   /10

Load Average ||

/0 /10 /20 /30 /40 /50 /60 /70 /80 /90 /100
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
root XF86_S3.cx XXXXXXX
wb kpanel XXX
wb kfm XX
wb kbgndwm XX
wb kblankscrn
wb krootwm
wb kwm

  除了這些系統提供的命令之外,FreeBSD也提供多種有效的系統工具,如綜合ps、systat和vmst at功能的top等。這些軟體通常可以在多種Unix系統中使用,也是十分常用的工具。也可以在FreeBSD系統中 安裝網路管理代理snmpd,然後使用網路管理系統通過網路來獲得FreeBSD主機的各種系統信息。