12.9 列出特定程序的进程

lsof -c [program]

在上一节中,你看到了谁正在使用/usr/sbin/sshd。虽然得到了一些结果,但这还不是全部。任何特定的程序实际上都是由几个(或很多)对其他进程、程序、套接字和设备的调用组成的,所有这些对于Linux来说都不过是更多的文件而已。为了找出与正在运行中的特定程序关联的所有其他文件,可以在lsof命令后面加上-c选项,然后是正在运行的(也就是“打开”的)程序的名称。例如,lsof /usr/sbin/sshd会报告与这个确切的文件关联的两个用户和三个打开的文件。但对于完整的sshd命令,又会怎样呢?

  1. # lsof -c sshd
  2. COMMAND PID USER NAME
  3. sshd 10542 root /lib/ld-2.3.5.so
  4. sshd 10542 root /dev/null
  5. sshd 10542 root 192.168.0.170:ssh-
  6. >192.168.0.100:4577
  7. ➥(ESTABLISHED)
  8. sshd 10548 scott /usr/sbin/sshdp
  9. sshd 10548 scott 192.168.0.170:ssh-
  10. >192.168.0.100:4577
  11. ➥(ESTABLISHED)

从前面的代码中可以看到,这94行(代表94个打开的文件)中的某些行与sshd程序有某种关联。一个是.so文件(共享对象,类似于Windows中的DLL文件),其余文件中的部分文件表明这台计算机和其他计算机之间的网络连接(实际上,这个网络上的其他计算机是通过SSH连接到这台计算机的。有关这个进程的更多内容,参见15.1节)。

对计算机上的各种命令应用lsof,可以找到大量信息,至少可以知道现代的程序是多么复杂。在每天使用的软件上试试这个命令,你可能会对提供软件的辛勤工作的开发人员萌生新的敬仰之情。

说明 lsof命令的选项数量多得让人吃惊,这里看到的只是它很小的一个子集。lsof的源代码包含一个名为00QUICKSTART的文件(前面两个是0),它是一个教程,介绍了关于这个命令的一些更为强大的特性。在Google中搜索一下这个文件名,开始阅读吧。