📜  Linux 中的 lsof 命令及示例(1)

📅  最后修改于: 2023-12-03 14:43:56.737000             🧑  作者: Mango

Linux 中的 lsof 命令及示例

简介

lsof(list open files)是一款用于列出当前系统中打开文件的工具,可以查看进程打开的文件以及网络连接等信息。lsof 工具非常强大和实用,适用于调试和排查各种问题。比如说,你可以使用 lsof 找出占用了某个端口的进程,或者查看正在读写某个文件的程序。

安装

可以通过以下命令安装 lsof 工具:

sudo apt-get install lsof
基本用法

lsof 的基本用法很简单,只需要在终端中输入以下命令即可:

lsof

这将会列出当前系统中所有打开的文件。如果你想查找某个进程打开的文件,你可以在命令后面加上进程 ID:

lsof -p <进程ID>

如果你想查找某个端口被哪个进程占用,你可以输入以下命令:

sudo lsof -i:<端口号>
示例
查看文件被哪个进程占用

首先,我们创建一个测试文件 /tmp/test.txt

touch /tmp/test.txt

然后,我们使用 lsof 命令查看文件是否被占用:

lsof /tmp/test.txt

输出:

COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
touch   15791 usernm 3w   REG    8,1        0 2162685 /tmp/test.txt

可以看到,此文件被 touch 进程占用。

查看某个进程打开了哪些文件

我们使用 ps 命令获取进程 ID:

ps ax | grep ssh

输出:

8865 ?        Ss     0:00 /usr/sbin/sshd -D
24622 pts/0    Ss+    0:00 sshd: usernm@pts/0
24737 pts/0    S+     0:00 grep --color=auto ssh

然后,我们使用 lsof 命令查看进程 sshd 打开了哪些文件:

lsof -p 8865

输出:

COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
sshd    8865 root  cwd    DIR    8,1     4096      2 /
sshd    8865 root  rtd    DIR    8,1     4096      2 /
sshd    8865 root  txt    REG    8,1  1440368 280131 /usr/sbin/sshd
sshd    8865 root  mem    REG    8,1    54248  44262 /lib/x86_64-linux-gnu/libnss_files-2.27.so
sshd    8865 root  mem    REG    8,1   143920  44260 /lib/x86_64-linux-gnu/libnsl-2.27.so
sshd    8865 root  mem    REG    8,1   198712  46045 /lib/x86_64-linux-gnu/libselinux.so.1
sshd    8865 root  mem    REG    8,1   211096  44192 /lib/x86_64-linux-gnu/libaudit.so.1.0.0
sshd    8865 root  mem    REG    8,1   173552   2107 /usr/lib/x86_64-linux-gnu/libgssapi.so.3.0.0
sshd    8865 root  mem    REG    8,1  2034464  44203 /lib/x86_64-linux-gnu/libcrypto.so.1.1
sshd    8865 root  mem    REG    8,1   454288  44193 /lib/x86_64-linux-gnu/libpcre.so.3.13.3
sshd    8865 root  mem    REG    8,1   128672  46047 /lib/x86_64-linux-gnu/libpthread-2.27.so
sshd    8865 root  mem    REG    8,1  1329456  44187 /lib/x86_64-linux-gnu/libc-2.27.so
sshd    8865 root  mem    REG    8,1    23512  44275 /lib/x86_64-linux-gnu/libdl-2.27.so
sshd    8865 root  mem    REG    8,1  8596328  44106 /usr/lib/locale/locale-archive
sshd    8865 root    0u   CHR  136,0      0t0      3 /dev/pts/0
sshd    8865 root    1u   CHR  136,0      0t0      3 /dev/pts/0
sshd    8865 root    2u   CHR  136,0      0t0      3 /dev/pts/0
sshd    8865 root    3u  unix 0xffff9fcc40c52100      0t0  89331 /var/run/sshd/8288
sshd    8865 root    4u  IPv6  89001      0t0   TCP *:ssh (LISTEN)

可以看到,进程 sshd 打开了很多文件,包括程序二进制文件、库文件、配置文件、标准输出输入等。

查看某个端口被哪个进程占用

我们使用 lsof 命令查看 22 端口被哪个进程占用:

sudo lsof -i:22

输出:

COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    8865   root    4u  IPv6  89001      0t0  TCP *:ssh (LISTEN)
sshd   24622 usernm    3u  IPv6  99197      0t0  TCP localhost:ssh->localhost:52512 (ESTABLISHED)

可以看到,进程 sshd 使用 22 端口监听 SSH 连接。