章 6. 系統監視公用程式

內容目錄

6.1. 開啟檔案的清單:lsof
6.2. 使用者存取檔案:fuser
6.3. 檔案內容:stat
6.4. USB 設備:lsusb
6.5. SCSI 設備的相關資訊:scsiinfo
6.6. 程序:top
6.7. 程序清單:ps
6.8. 程序樹:pstree
6.9. 功能介紹:w
6.10. 記憶體的使用:free
6.11. 核心環狀緩衝區:dmesg
6.12. 檔案系統及其使用:mountdfdu
6.13. /proc 檔案系統
6.14. PCI 資源:lspci
6.15. 執行程式的系統呼叫:strace
6.16. 程式執行的程式庫呼叫:ltrace
6.17. 指定需要的程式庫:ldd
6.18. 其它有關 ELF 二進位檔的資訊
6.19. 程序間通訊:ipcs
6.20. 使用 time 進行時間管理

摘要

您可以使用多種程式和機制來檢查系統狀態,本文將介紹其中一些工具。另外還會介紹一些例行工作使用的公用程式,及其重要參數。

所有介紹的指令都會有相關的輸出範例。在這些範例中,第一行是指令本身(在 > 或 # 符號提示之後)。方括號 [...] 可用來表示省略,而且較長指令行會換行。較長指令行的斷行會用反斜線 (\) 表示。

# command -x -y
output line 1
output line 2
output line 3 is annoyingly long, so long that \
    we have to break it
output line 3
[...]
output line 98
output line 99

我們會盡量簡短說明,以便介紹更多公用程式。如需所有指令的相關資訊,請參閱 man 頁面。大部份的指令都能解讀參數 --help,此參數可產生一份可能參數的簡短清單。


6.1. 開啟檔案的清單:lsof

如果要檢視為了程序而開啟的所有檔案之清單及其程序 ID PID,可使用 -p。例如,要檢視目前外圍程序正在使用的所有檔案,可輸入:

tester@linux:~> lsof -p $$
COMMAND  PID   USER   FD   TYPE DEVICE    SIZE   NODE NAME
bash    5552 tester  cwd    DIR    3,3    1512 117619 /home/tester
bash    5552 tester  rtd    DIR    3,3     584      2 /
bash    5552 tester  txt    REG    3,3  498816  13047 /bin/bash
bash    5552 tester  mem    REG    0,0              0 [heap] (stat: No such \
 file or directory)
bash    5552 tester  mem    REG    3,3  217016 115687 /var/run/nscd/passwd
bash    5552 tester  mem    REG    3,3  208464  11867 \
 /usr/lib/locale/en_GB.utf8/LC_CTYPE
bash    5552 tester  mem    REG    3,3  882134  11868 \
 /usr/lib/locale/en_GB.utf8/LC_COLLATE
bash    5552 tester  mem    REG    3,3 1386997   8837 /lib/libc-2.3.6.so
bash    5552 tester  mem    REG    3,3   13836   8843 /lib/libdl-2.3.6.so
bash    5552 tester  mem    REG    3,3  290856  12204 /lib/libncurses.so.5.5
bash    5552 tester  mem    REG    3,3   26936  13004 /lib/libhistory.so.5.1
bash    5552 tester  mem    REG    3,3  190200  13006 /lib/libreadline.so.5.1
bash    5552 tester  mem    REG    3,3      54  11842 \
 /usr/lib/locale/en_GB.utf8/LC_NUMERIC
bash    5552 tester  mem    REG    3,3    2375  11663 \
 /usr/lib/locale/en_GB.utf8/LC_TIME
bash    5552 tester  mem    REG    3,3     290  11736 \
 /usr/lib/locale/en_GB.utf8/LC_MONETARY
bash    5552 tester  mem    REG    3,3      52  11831 \
 /usr/lib/locale/en_GB.utf8/LC_MESSAGES/SYS_LC_MESSAGES
bash    5552 tester  mem    REG    3,3      34  11862 \
 /usr/lib/locale/en_GB.utf8/LC_PAPER
bash    5552 tester  mem    REG    3,3      62  11839 \
 /usr/lib/locale/en_GB.utf8/LC_NAME
bash    5552 tester  mem    REG    3,3     127  11664 \
 /usr/lib/locale/en_GB.utf8/LC_ADDRESS
bash    5552 tester  mem    REG    3,3      56  11735 \
 /usr/lib/locale/en_GB.utf8/LC_TELEPHONE
bash    5552 tester  mem    REG    3,3      23  11866 \
 /usr/lib/locale/en_GB.utf8/LC_MEASUREMENT
bash    5552 tester  mem    REG    3,3   21544   9109 \
 /usr/lib/gconv/gconv-modules.cache
bash    5552 tester  mem    REG    3,3     366   9720 \
 /usr/lib/locale/en_GB.utf8/LC_IDENTIFICATION
bash    5552 tester  mem    REG    3,3   97165   8828 /lib/ld-2.3.6.so
bash    5552 tester    0u   CHR  136,5              7 /dev/pts/5
bash    5552 tester    1u   CHR  136,5              7 /dev/pts/5
bash    5552 tester    2u   CHR  136,5              7 /dev/pts/5
bash    5552 tester  255u   CHR  136,5              7 /dev/pts/5
  

特殊外圍程序變數 $$,其值就是外圍程序的程序 ID。

指令 lsof 列出所有目前開啟的檔案,使用時不需任何參數。因為通常其中有數千個檔案開啟,所以直接列出所有檔案並沒有太大用處。不過,您可將這份包含所有檔案的清單結合搜尋功能,產生有用的清單。例如,將用到的字元設備全部列出:

tester@linux:~> lsof | grep CHR
bash      3838     tester    0u      CHR  136,0                 2 /dev/pts/0
bash      3838     tester    1u      CHR  136,0                 2 /dev/pts/0
bash      3838     tester    2u      CHR  136,0                 2 /dev/pts/0
bash      3838     tester  255u      CHR  136,0                 2 /dev/pts/0
bash      5552     tester    0u      CHR  136,5                 7 /dev/pts/5
bash      5552     tester    1u      CHR  136,5                 7 /dev/pts/5
bash      5552     tester    2u      CHR  136,5                 7 /dev/pts/5
bash      5552     tester  255u      CHR  136,5                 7 /dev/pts/5
X         5646       root  mem       CHR    1,1              1006 /dev/mem
lsof      5673     tester    0u      CHR  136,5                 7 /dev/pts/5
lsof      5673     tester    2u      CHR  136,5                 7 /dev/pts/5
grep      5674     tester    1u      CHR  136,5                 7 /dev/pts/5
grep      5674     tester    2u      CHR  136,5                 7 /dev/pts/5