第 25 章 系统监视实用程序

目录

25.1. 打开的文件的列表:lsof
25.2. 访问文件的用户:fuser
25.3. 文件属性:stat
25.4. USB 设备:lsusb
25.5. 关于 SCSI 设备的信息:scsiinfo
25.6. 进程:top
25.7. 进程列表:ps
25.8. 进程树:pstree
25.9. 哪些用户在执行哪些操作:w
25.10. 内存使用:free
25.11. 内核信号缓冲区:dmesg
25.12. 文件系统及其使用:mountdfdu
25.13. /proc 文件系统
25.14. vmstatiostatmpstat
25.15. procinfo
25.16. PCI 资源:lspci
25.17. 程序运行的系统调用:strace
25.18. 程序运行的库调用:ltrace
25.19. 指定必需的库:ldd
25.20. 有关 ELF 二进制文件的其他信息
25.21. 进程间通讯:ipcs
25.22. 使用 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 

这里尽量缩短对每个实用程序的说明,从而介绍尽量多的实用程序。手册页中提供了所有命令的详细信息。大多数命令还接受参数 --help,该参数将生成可能参数的简要列表。

25.1. 打开的文件的列表:lsof

要查看为具有进程 ID PID 的进程打开的所有文件的列表,请使用 -p。例如,要查看当前 shell 使用的所有文件,请输入:

$ lsof -p $$
COMMAND  PID USER   FD   TYPE DEVICE    SIZE     NODE NAME
zsh     4694   jj  cwd    DIR   0,18     144 25487368 /suse/jj/t (totan:/real-home/jj)
zsh     4694   jj  rtd    DIR    3,2     608        2 /
zsh     4694   jj  txt    REG    3,2  441296    20414 /bin/zsh
zsh     4694   jj  mem    REG    3,2  104484    10882 /lib/ld-2.3.3.so
zsh     4694   jj  mem    REG    3,2   11648    20610 /usr/lib/zsh/4.2.0/zsh/rlimits.so
[...]
zsh     4694   jj  mem    REG    3,2   13647    10891 /lib/libdl.so.2
zsh     4694   jj  mem    REG    3,2   88036    10894 /lib/libnsl.so.1
zsh     4694   jj  mem    REG    3,2  316410   147725 /lib/libncurses.so.5.4
zsh     4694   jj  mem    REG    3,2  170563    10909 /lib/tls/libm.so.6
zsh     4694   jj  mem    REG    3,2 1349081    10908 /lib/tls/libc.so.6
zsh     4694   jj  mem    REG    3,2      56    12410 /usr/lib/locale/de_DE.utf8/LC_TELEPHONE
[...]
zsh     4694   jj  mem    REG    3,2      59    14393 /usr/lib/locale/en_US/LC_NUMERIC
zsh     4694   jj  mem    REG    3,2  178476    14565 /usr/lib/locale/en_US/LC_CTYPE
zsh     4694   jj  mem    REG    3,2   56444    20598 /usr/lib/zsh/4.2.0/zsh/computil.so
zsh     4694   jj    0u   CHR 136,48               50 /dev/pts/48
zsh     4694   jj    1u   CHR 136,48               50 /dev/pts/48
zsh     4694   jj    2u   CHR 136,48               50 /dev/pts/48
zsh     4694   jj   10u   CHR 136,48               50 /dev/pts/48

使用了特殊 shell 变量 $$,它的值是 shell 的进程 ID。

如果不带任何参数使用命令 lsof,它将列出当前打开的所有文件。由于有数千个打开的文件,大多数情况下不必列出所有这些文件。但是,所有文件的列表可以与搜索功能组合在一起产生有用的列表。例如,列出所有使用过的字符设备:

$ lsof | grep CHR
sshd       4685    root  mem    CHR    1,5             45833 /dev/zero
sshd       4685    root  mem    CHR    1,5             45833 /dev/zero
sshd       4693      jj  mem    CHR    1,5             45833 /dev/zero
sshd       4693      jj  mem    CHR    1,5             45833 /dev/zero
zsh        4694      jj    0u   CHR 136,48                50 /dev/pts/48
zsh        4694      jj    1u   CHR 136,48                50 /dev/pts/48
zsh        4694      jj    2u   CHR 136,48                50 /dev/pts/48
zsh        4694      jj   10u   CHR 136,48                50 /dev/pts/48
X          6476    root  mem    CHR    1,1             38042 /dev/mem
lsof      13478      jj    0u   CHR 136,48                50 /dev/pts/48
lsof      13478      jj    2u   CHR 136,48                50 /dev/pts/48
grep      13480      jj    1u   CHR 136,48                50 /dev/pts/48
grep      13480      jj    2u   CHR 136,48                50 /dev/pts/48