lsof Linux命令用于列出打开的文件。在Linux系统上,所有东西都被认为是一个文件。这意味着文件、目录、套接字、管道、设备等都是文件,因此如果其中任何一个正在使用,lsof命令将列出所有这些东西。
除了显示哪些文件正在使用之外,它还将提供关于哪个用户和进程正在使用该文件的详细信息。可以想象,在许多情况下,这是非常方便的,例如,当试图找出哪些连接正在连接到您的系统,或哪些进程占用了您试图卸载的磁盘时,等等。
直接运行lsof可以列出所有打开的文件:

lsof输出列说明:
并非所有列都适用于所有类型的打开文件。其中一些是空白的,这是正常的。
- Command: 与打开该文件的进程相关联的命令的名称。
- PID: 打开文件的进程id
- TID: Task (thread)标识号。空白列意味着它不是任务;这是一个进程。
- User: 进程所属的用户ID或用户名
- FD: 显示文件的文件描述符。将在下面描述文件描述符。
- Type: 与文件关联的节点类型,将在下面描述。
- Device: 包含字符设备文件、块设备文件、常规文件、目录或NFS文件的设备号(用逗号分隔),或者标识文件的内核引用地址。它还可能显示Linux AX.25套接字设备的基地址或设备名。
- Size/Off: 显示以字节为单位的文件大小或文件偏移量。
- Node: 显示一个本地文件的节点号,或者一个NFS文件所在服务主机上的inode号,或者网络协议类型。它也可能显示流(stream)的STR或者IPQ,或者一个Linux AX.25 套接字设备的inode 号。
- Name: 显示文件所在的挂载点和文件系统的名称
FD 列说明
FD列中的文件描述符可以是众多选项之一; lsof的man page列出了它的所有项。
FD列条目可以由三部分组成:文件描述符,模式字符,锁字符, 由于很多名词还是使用英文更好理解一点,这里直接列出了英文的描述。
下面是一些常见的文件描述符:
- cwd: Current working directory.
- err: FD information error (see NAME column).
- ltx: Shared library text (code and data).
- m86: DOS Merge mapped file.
- mem: Memory-mapped file.
- mmap: Memory-mapped device.
- pd: Parent directory.
- rtd: Root directory.
- txt: Program text (code and data)
- A number, representing a file descriptor.
模式字符可以是以下任意一种:
- r: Read access.
- w: Write access.
- u: Read and Write access.
- ‘ ‘: A space character, if the mode is unknown and there is no lock character.
- –: Mode unknown and there is a lock character.
锁定字符可以是:
- r: Read lock on part of the file.
- R: Read lock on the entire file.
- w: Write lock on part of the file.
- W: Write lock on the entire file.
- u: Read and write lock of any length.
- U: Unknown lock type.
- ‘ ‘: A space character. No lock.
TYPE列说明
TYPE列中可能出现70多个条目。下面列举一些常见的条目:
- REG: Regular filesystem file.
- DIR: Directory.
- FIFO: First In First Out.
- CHR: Character special file.
- BLK: Block special file.
- INET: Internet socket.
- unix: UNIX domain socket
列出打开某个文件的进程
要查看已打开某个文件的进程,可以将文件的名称作为参数提供给lsof。例如,要查看打开kern.log文件的进程,可以使用以下命令:
lsof /var/log/kern.log

列出属于特定用户的进程打开的文件
该工具还允许您列出属于特定用户的进程打开的文件。可以使用-u命令行选项访问该特性。
lsof -u [user-name]
例如:
lsof -u administrator

列出基于网络地址打开的文件
该工具允许您根据其Internet地址列出文件。这可以使用-i命令行选项来完成。例如,如果需要,可以分别显示IPv4和IPv6文件。对于IPv4协议,执行如下命令:
lsof -i 4

同样,对于 IPv6,运行以下命令:
lsof -i 6

按应用程序名称列出所有文件
命令行选项-c允许按程序名获取所有文件。
$ lsof -c apache
您不必使用完整的程序名,因为所有以“apache”开头的程序都会显示出来。所以在我们的例子中,它会列出’apache2’应用程序的所有进程。

列出某个特定进程打开的文件
该工具还允许根据进程标识(PID)号显示打开的文件。这可以通过使用-p命令行选项来完成。
lsof -p 856

接下来,您还可以通过在输出中添加^符号来排除特定的pid。如果需要排除指定的PID,可以执行如下命令:
lsof -p [^PID]
例如:
lsof -p ^1

正如您在上面的截图中看到的,id为1的进程被排除在列表之外。
列出已打开特定文件的进程id
该工具允许您列出已打开特定文件的进程的id。这可以通过使用-t命令行选项来完成。
$ lsof -t [file-name]
例如:
$ lsof -t /usr/lib/x86_64-linux-gnu/libpcre2-8.so.0.9.0

列出一个目录中所有打开的文件
如果愿意,还可以让lsof搜索一个目录的所有打开实例(包括它包含的所有文件和目录)。可以使用+D命令行选项访问该特性。
$ lsof +D [directory-path]
例如;
$ lsof +D /usr/lib/locale

列出所有互联网和x.25(HP-UX)网络文件
这可以通过使用我们前面描述的**-i**命令行选项实现。只是你必须没有参数地使用它。
$ lsof -i

找出哪个程序正在使用一个端口
该命令的-i开关允许您查找侦听特定端口号的进程或应用程序。在下面的例子中,我检查了哪个程序正在使用80端口。
$ lsof -i :80
您可以使用/etc/services文件中列出的服务名称代替端口号。例如检查哪个应用程序监听HTTPS(443)端口。
$ lsof -i :https

上面的例子将同时检查TCP协议和UDP协议。如果你想只检查TCP或UDP,在前面加上’ TCP ‘或’ UDP '。例如,哪个应用程序正在使用端口25 TCP:
$ lsof -i tcp:25
或哪个应用程序使用UDP端口53:
$ lsof -i udp:53

列出基于端口范围打开的文件
该实用程序还允许您根据特定的端口或端口范围列出打开的文件。例如,显示端口1-1024打开的文件,使用如下命令:
$ lsof -i :1-1024

根据连接类型(TCP或UDP)列出打开的文件
该工具允许您根据连接类型列出文件。例如,对于UDP特定的文件,使用以下命令:
$ lsof -i udp

lsof列出每个进程的PID
还有一个选项强制lsof在输出中列出父进程标识(PPID)号。这个选项是-R。
$ lsof -R
要获取指定PID的PPID信息,可以执行以下命令:
$ lsof -p [PID] -R
例如
$ lsof -p 3 -R

如何根据用户查找网络活动
通过使用**-i和-u**命令行选项的组合,我们可以搜索Linux用户的所有网络连接。如果您检查一个可能被黑客攻击的系统,这可能会很有帮助。在这个例子中,我们检查用户www-data的所有网络活动:
$ lsof -a -i -u www-data

注意上面的-a选项,是and的意思,不加-a是or的意思。
列出所有内存映射文件
-d选项提供了这个特性,使用FD来列出文件,这个命令列出了Linux上所有的内存映射文件。
$ lsof -d mem

列出所有NFS文件
-N选项显示所有NFS(网络文件系统)文件的列表。
$lsof -N
结论
虽然lsof提供了大量的选择,但我们在这里讨论的应该足以让您入门。一旦您完成了这些操作,请访问工具的man page以了解更多相关信息。哦,如果你有任何疑问和问题,请在下方评论。
lsof是一个强大的Linux命令,用于列出系统中打开的文件,包括进程、用户、文件描述符、类型等详细信息。它可以用来查看哪个进程打开了特定文件、哪些文件被特定用户使用、网络连接状态等。例如,`lsof -i`用于查看网络连接,`lsof +D`搜索目录下所有打开的文件,`lsof -t`列出文件的进程ID,而`lsof -u`则按用户显示打开的文件。lsof是系统管理员进行故障排查和性能优化的重要工具。

270

被折叠的 条评论
为什么被折叠?



