Lsof 命令

lsof, ls open files.

列举当前打开的文件, 文件也包括网络连接(socket 文件),设备文件, 以及目录文件.

lsof的输出包括了如下几列:

  1. lsof | head
  2. COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  3. systemd 1 root cwd unknown /proc/1/cwd (readlink: Permission denied)
  4. systemd 1 root rtd unknown /proc/1/root (readlink: Permission denied)
  5. systemd 1 root txt unknown /proc/1/exe (readlink: Permission denied)
  6. systemd 1 root NOFD /proc/1/fd (opendir: Permission denied)
  7. kthreadd 2 root cwd unknown /proc/2/cwd (readlink: Permission denied)
  8. kthreadd 2 root rtd unknown /proc/2/root (readlink: Permission denied)
  9. kthreadd 2 root txt unknown /proc/2/exe (readlink: Permission denied)
  10. kthreadd 2 root NOFD /proc/2/fd (opendir: Permission denied)
  11. ksoftirqd 3 root cwd unknown /proc/3/cwd (readlink: Permission denied)

说一下这几列都代表了什么:

  • COMMAND 进程的命令
  • PID 进程ID
  • USER 用户名
  • FD 文件描述符
  • TYPE 文件类型
  • DEVICE 设备编号
  • SIZE 文件大小
  • NODE 节点编号
  • NAME 文件的绝对路径名

显示系统打开的所有文件

  1. lsof | less

只是显示出来并没有太大的作用, 但是统计的话, 就另当别论了:

  1. lsof | wc -l
  2. 73610

可以看到我一共打开了73610个文件.

查看特定用户打开的文件

-u参数:

  1. # lsof –u ramesh
  2. vi 7190 ramesh 475196 /bin/vi txt REG 8,1 474608
  3. sshd 7163 ramesh 3u IPv6 15088263 TCP dev-db:ssh->abc-12-12-12-12.socal.res.rr.com:2631 (ESTABLISHED)

查看特定程序打开的文件

lsof progream_name:

  1. lsof /usr/bin/vi
  2. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  3. vi 12760 mr txt REG 252,1 2837384 1051186 /usr/bin/vim.gnome

其实还有一些好玩的, 还有参数介绍什么的, 我博客里有写.(没网啊, 不能贴具体的链接… 麻烦各位看官自己找找去… 里面还有个类似的软件 [fuser], 很是强大 http://wrfly.kfd.me )