1. 进程信息

在浏览 /proc 目录的时候您会发现许多目录的名称是一些数字。这些目录保存了当前系统中运行的所有进程的信息。

$ ls -d /proc/[0-9]*
/proc/1/    /proc/302/  /proc/451/  /proc/496/  /proc/556/  /proc/633/
/proc/127/  /proc/317/  /proc/452/  /proc/497/  /proc/557/  /proc/718/
/proc/2/    /proc/339/  /proc/453/  /proc/5/    /proc/558/  /proc/755/
/proc/250/  /proc/385/  /proc/454/  /proc/501/  /proc/559/  /proc/760/
/proc/260/  /proc/4/    /proc/455/  /proc/504/  /proc/565/  /proc/761/
/proc/275/  /proc/402/  /proc/463/  /proc/505/  /proc/569/  /proc/769/
/proc/290/  /proc/433/  /proc/487/  /proc/509/  /proc/594/  /proc/774/
/proc/3/    /proc/450/  /proc/491/  /proc/554/  /proc/595/

请注意,作为普通用户,您(理论上)只能查看与您自己的进程相关的信息,而不是其他用户的。因此,请升级为 root 用户,看看进程 1 的信息,该进程是 init 进程,它负责启动所有其它进程:

$ su
Password:
# cd /proc/1
# ls -l
total 0
-r--------  1 root root 0 Aug 15 18:14 auxv
-r--r--r--  1 root root 0 Aug 15 18:14 cmdline
lrwxrwxrwx  1 root root 0 Aug 15 18:14 cwd -> //
-r--------  1 root root 0 Aug 15 18:14 environ
lrwxrwxrwx  1 root root 0 Aug 15 18:14 exe -> /sbin/init*
dr-x------  2 root root 0 Aug 15 18:14 fd/
-rw-r--r--  1 root root 0 Aug 15 18:14 loginuid
-r--r--r--  1 root root 0 Aug 15 18:14 maps
-rw-------  1 root root 0 Aug 15 18:14 mem
-r--r--r--  1 root root 0 Aug 15 18:14 mounts
-rw-r--r--  1 root root 0 Aug 15 18:14 oom_adj
-r--r--r--  1 root root 0 Aug 15 18:14 oom_score
lrwxrwxrwx  1 root root 0 Aug 15 18:14 root -> //
-rw-------  1 root root 0 Aug 15 18:14 seccomp
-r--r--r--  1 root root 0 Aug 15 18:14 stat
-r--r--r--  1 root root 0 Aug 15 18:14 statm
-r--r--r--  1 root root 0 Aug 15 18:14 status
dr-xr-xr-x  3 root root 0 Aug 15 18:14 task/
-r--r--r--  1 root root 0 Aug 15 18:14 wchan
#

每个目录包含同样的项目。以下简单介绍其中某些项目:

  1. cmdline:该(虚拟)文件包含了启动该进程的整个命令行。它未曾格式化:程序与其参数之间没有空格,行末也没有换行。要查看它,您可以使用:perl -ple 's,\00, ,g' cmdline

  2. cwd:该符号链接指向该进程的当前工作目录。

  3. environ:该文件包含为该进程定义的所有环境变量,格式为 变量=值。与 cmdline 文件一样,其内容未曾格式化过:各个变量之间没有分行,文件末尾也没有换行。要查看,可以:perl -ple 's,\00,\n,g' environ

  4. exe:这是指向该进程所执行的可执行程序文件的符号链接。

  5. fd:在此子目录中包含了该进程当前打开的所有描述符。参见下文。

  6. maps:当您打印该命名管道内容时(例如使用 cat),您将看到该进程地址空间中当前映射到文件中的那部分。自左至右各列为:与该映射关联的地址空间,与该映射关联的权限,该映射起始位置的偏移量(从文件开始处算起),保存该映射文件设备的主、从序号(十六进制格式),该文件的 inode 序号,以及该文件的文件名。当设备号为 0 且没有 inode 号或文件名时,它就是一个匿名映射。请参阅 mmap(2)

  7. root:该符号链接指向该进程使用的根目录。通常为 /,请参阅 chroot(2)

  8. status:该文件包含该进程的众多信息:可执行文件名、当前状态、PIDPPID、实际及有效的 UIDGID、内存使用情况、以及其他。请注意,statstatm 现已过时。它们包含的信息现存于 status

如果我们随便选择一个进程,然后列出其 fd 目录中的内容,我们将看到:

# ls -l /proc/8141/fd/
total 4
lrwx------  1 li_si li_si 64 Aug  4 09:05 0 -> /dev/tty1
lrwx------  1 li_si li_si 64 Aug  4 09:05 1 -> /dev/tty1
lrwx------  1 li_si li_si 64 Aug  4 09:05 2 -> /dev/tty1
l-wx------  1 li_si li_si 64 Aug  4 09:05 3 -> /home/li_si/seti32/lock.sah
#

实际上,这是该进程打开的文件描述符列表。每个打开的描述符由一个符号链接表示,其名称为该描述符的编号,并指向该描述符打开的文件[7]。请注意这些符号链接的权限:它们的意义仅代表被相应描述符打开的文件的权限。



[7] 如果您还记得第 4 节 “重定向和管道”一节的内容,您就应该了解描述符 0、1 和 2 分别代表什么。描述符 0 代表标准输入,描述符 1 代表标准输出,而描述符 2 代表标准错误。