lsof简述


发布于 2016-07-10 / 50 阅读 / 0 评论 /
lsof全称List Open Files,是linux系统中常用的系统级监控、诊断工具。用于列举各种被进程打开的文件信息。

linux下,一切皆文件,包括files、pipes、sockets、directories、devices等等。

1.lsof相关常用链接

通过"lsof --help"我们可以看到几个重要的链接

(1)最新版本代码:https://github.com/lsof-org/lsof

(2)最新FAQ:https://github.com/lsof-org/lsof/blob/master/00FAQ

(3)最新使用文档:https://github.com/lsof-org/lsof/blob/master/Lsof.8

2.常用命令行选项

通过"lsof --help"可以看到工具支持的命令行选项。共有以下几种

  • -a:表示其他选项之间为”与“的关系;

  • -c {进程名}:列出指定进程所打开的文件;

  • -g:列出指定GID号进程详情;

  • -d {文件号}:列出占用该文件号的进程;

  • +d {目录}:列出目录下被打开的文件;

  • +D {目录}:递归列出目录下被打开的文件;

  • -n {目录}:列出使用NFS的文件;

  • -i {条件}:列出符合条件的进程(协议、:端口、 @ip )

  • -p {进程号}:列出指定进程号所打开的文件;

  • -u:列出指定UID号或用户名的进程详情;

  • -h或-?:显示帮助信息;

  • -v:显示版本信息

  • -t:只显示进程id

  • -r {time-interval}:重复执行,直到它接收到来自用户的中断/终止信号

  • +r {time-interval}:重复模式将在其输出没有打开文件时立即结束

3.lsof输出信息

lsof命令输出的信息中,主要有以下字端

(1)COMMAND

进程名称

(2)PID

进程号

(3)PPID

父进程号

(4)USER

进程所有者

(5)FD

文件描述符,应用程序通过文件描述符识别该文件。

  • cwd:当前目录

  • txt:程序文本,如应用程序二进制文件或共享库

  • Lnn:库引用 library references (AIX)

  • err:文件描述符信息错误

  • jld:jail目录(FreeBSD)

  • ltx:共享库文本(代码和数据)

  • mxx:十六进制内存映射类型编号xx

  • m86:DOS合并映射文件

  • mem:内存映射文件

  • mmap:内存映射设备

  • pd:父目录

  • rtd:根目录

  • tr:内核跟踪文件(OpenBSD)

  • v86:VP/ix 映射文件

  • 0:标准输入

  • 1:标准输出

  • 2:标准错误

一般在标准输出、标准错误、标准输入后还跟着文件状态模式:

  • u:表示该文件被打开并处于读取/写入模式

  • r:表示该文件被打开并处于只读模式

  • w:表示该文件被打开并处于写入模式

  • 空格:表示该文件的状态模式为 unknow,且没有锁定

  • -:表示该文件的状态模式为 unknow,且被锁定

(6)TYPE

文件类型,常见的类型有以下6种。

类型名称

说明

DIR

目录

CHR

字符类型

BLK

块设备

UNIX

UNIX域套接字

FIFO

先进先出队列

IPv4

网际协议套接字

(7)DEVICE

指定磁盘名称

(8)SIZE

文件的大小

(9)NODE

索引节点,文件在磁盘上的唯一标识。

(10)NAME

表示打开文件的具体名称

4.lsof使用场景

主要有以下使用场景。

(1)文件被哪个进程占用

lsof {文件全路径}

(2)显示目录下被进程打开的文件

有两种用法

# 查看当前目录下被打开的文件,不会查看子目录
lsof +d {目录全路径}

# 查看当前目录及其字目录下被打开的文件
lsof +D {目录全路径}

(3)检查端口是否被占用

# 检查端口是否被使用
lsof -i:{端口号}

# 列出所有TCP或UDP协议的文件
lsof -i TCP/UDP

# 列出使用了TCP协议,且端口号为80的文件
lsof -i TCP:80

# 列出使用了TCP协议,且端口号为1-1024的文件
lsof -i TCP:1-1024

(4)查看指定用户的进程打开的文件

lsof -u {用户名}

(5)通过文件描述符来查找进程

lsof -d {FD}

(6)列出指定进程号打开的文件

# 指定单个进程
lsof -p {进程号}

# 指定多个进程,通过逗号分隔
lsof -p {进程号1},{进程号2},{进程号3}

# 如果想排除某个进程打开的文件,可通过^符号,比如排除{进程号4}打开的文件
lsof -p {进程号1},^{进程号4}

(7)kill指定用户的所有进程

kill -9 `lsof -t -u testuser`