Linux命令学习之lsof

Linux命令学习之lsof

简介

lsof是一个用于列出进程打开的文件的命令。由于在Linux系统上“一切皆文件”,lsof不仅可以获取进程打开的普通文件的列表,还可以获取进程打开的目录、块特殊文件、字符特殊文件、套接字等各种信息。

lsof的安装

1
2
# 在ArchLinux上通过pacman安装。
sudo pacman -S lsof

lsof输出的信息

我们打开nano文本编辑器,然后执行lsof -c nano,输出如下:

\COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nano 19027 lsh cwd DIR 259,9 60 134261379 /home/lsh/learn/c
nano 19027 lsh rtd DIR 259,8 224 128 /
nano 19027 lsh txt REG 259,8 352840 34708268 /usr/bin/nano
nano 19027 lsh mem REG 259,8 6198768 102247963 /usr/lib/locale/locale-archive
nano 19027 lsh mem REG 259,8 154040 100664178 /usr/lib/libpthread-2.33.so
nano 19027 lsh mem REG 259,8 100096 100665882 /usr/lib/libz.so.1.2.11
nano 19027 lsh mem REG 259,8 74448 100665990 /usr/lib/libbz2.so.1.0.8
nano 19027 lsh mem REG 259,8 157456 100665887 /usr/lib/liblzma.so.5.2.5
nano 19027 lsh mem REG 259,8 2150424 100664130 /usr/lib/libc-2.33.so
nano 19027 lsh mem REG 259,8 453688 100664712 /usr/lib/libncursesw.so.6.2
nano 19027 lsh mem REG 259,8 170080 100665234 /usr/lib/libmagic.so.1.0.0
nano 19027 lsh mem REG 259,8 54380 34753993 /usr/share/locale/zh_CN/LC_MESSAGES/nano.mo
nano 19027 lsh mem REG 259,8 221480 100664118 /usr/lib/ld-2.33.so
nano 19027 lsh 0u CHR 136,2 0t0 5 /dev/pts/2
nano 19027 lsh 1u CHR 136,2 0t0 5 /dev/pts/2
nano 19027 lsh 2u CHR 136,2 0t0 5 /dev/pts/2
nano 19146 lsh cwd DIR 259,8 8192 100663426 /etc
nano 19146 lsh rtd DIR 259,8 224 128 /
nano 19146 lsh txt REG 259,8 352840 34708268 /usr/bin/nano
nano 19146 lsh mem REG 259,8 6198768 102247963 /usr/lib/locale/locale-archive
nano 19146 lsh mem REG 259,8 154040 100664178 /usr/lib/libpthread-2.33.so
nano 19146 lsh mem REG 259,8 100096 100665882 /usr/lib/libz.so.1.2.11
nano 19146 lsh mem REG 259,8 74448 100665990 /usr/lib/libbz2.so.1.0.8
nano 19146 lsh mem REG 259,8 157456 100665887 /usr/lib/liblzma.so.5.2.5
nano 19146 lsh mem REG 259,8 2150424 100664130 /usr/lib/libc-2.33.so
nano 19146 lsh mem REG 259,8 453688 100664712 /usr/lib/libncursesw.so.6.2
nano 19146 lsh mem REG 259,8 170080 100665234 /usr/lib/libmagic.so.1.0.0
nano 19146 lsh mem REG 259,8 54380 34753993 /usr/share/locale/zh_CN/LC_MESSAGES/nano.mo
nano 19146 lsh mem REG 259,8 221480 100664118 /usr/lib/ld-2.33.so
nano 19146 lsh 0u CHR 136,2 0t0 5 /dev/pts/2
nano 19146 lsh 1u CHR 136,2 0t0 5 /dev/pts/2
nano 19146 lsh 2u CHR 136,2 0t0 5 /dev/pts/2

可以看到lsof输出许多列的信息,各列信息的含义如下:

COMMAND: 执行该进程的可执行文件的名称
PID: 进程的进程号
USER: 进程的所有者
FD: 文件的文件描述符,可能有以下取值:

txt: 该文件是程序代码
mem: 内存映射文件
rtd: 根目录
cwd: 当前工作目录
打开文件的文件描述符,r表示读取访问,w表示写访问,u表示读写访问。
TYPE: 文件的类型
DEVICE: 设备号
SIZE/OFF: 文件的大小或偏移量
NODE: 文件的i-node号
NAME: 文件的绝对路径

常用选项

选项 说明
没有选项 如果lsof不加任何选项,将列出所有进程的打开文件
-h 列出帮助信息
-c COMMAND 显示进程名称以COMMAND开头的进程信息
-g GID 列出组ID为GID的进程
-p PID 列出进程号为PID的进程
-d FD 列出文件描述符为FD的文件
+d DIR 列出目录被打开的进程
+D DIR 递归列出目录下被打开的文件
-u UID 列出所有者ID为UID的进程

参考

  1. lsof(8) — Linux manual page
  2. 每天一个linux命令(51):lsof命令

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!