关于linux:通过18个实例掌握-lsof-命令

40次阅读

共计 4321 个字符,预计需要花费 11 分钟才能阅读完成。

在本指南中,咱们将通过 18 个不同的理论示例学习 lsof 命令。

lsof 命令用于列出 Linux 等操作系统中关上的文件。名称 lsof 自身就是从这个性能派生进去的。

在哪里应用 lsof?

Lsof 命令次要用于检索各个过程关上的文件信息。零碎中关上的文件能够是磁盘文件、网络套接字、命名管道和设施。lsof 命令的这一独特个性,使人们可能更好地调试和了解 Linux 操作系统。

如何装置 lsof?

当咱们最小装置 RHEL / CentOS / AlmaLinux / Ubuntu / OpenSUSE 的时,lsof 不是默认装置的一部分,因而应用以下命令来装置 lsof 命令。

RHEL / CentOS / AlmaLinux / Fedora 零碎下装置

$ sudo yum install lsof -y
or
$ sudo dnf install lsof -y

Debian 系列 (Ubuntu / Linux Mint) 零碎下装置

$ sudo apt install lsof -y

OpenSUSE 零碎下装置

$ sudo zypper install lsof

1) 列出所有关上的文件

不带任何选项地运行 lsof 命令将列出零碎中所有流动过程关上的文件。

留神: 因为 lsof 输入给了 STDOUT 很多信息,最好应用管道 | 操作来逐页查看这个输入。

# lsof | more

如果仔细检查,下面的命令输入提供了许多参数的信息。例如,过程 systemd 的过程号 (PID) 为 1,用户为 root,文件描述符 (FD) 为 cwd 等等。

FD 有很多值,因为在 Linux 零碎中,文件描述符是为任何关上的文件主动生成的。上面是用于 lsof 命令的一些家喻户晓的 FD 值

留神: 在某些状况下,mem 前面跟着数字和各种字符,如 r, u, w 等。这些字符是 r 示意读,w 示意写,u 示意读和写。

回显中的 TYPE 为文件类型,以下是 Linux 零碎中规范的文件类型。

与此一起显示的其余字段如下所示

  • DEVICE –> Device id
  • SIZE/OFF –> Actual size of this process (taken during run time)
  • NODE –> Typically inode number of the directory or parent directory
  • NAME –> Path or link

2) 列出特定文件系统关上的文件

如您所知,/proc 只在 Linux 操作系统的生命周期内存在,这个目录蕴含了许多重要的过程相干信息。在 /proc 上执行 lsof 将抛出乏味的输入

# lsof /proc

如前所述,此处捕捉 lsof 自身的 lsof,并显示所有细节。除了 lsof,还有其余过程,如 systemd 和 rsyslogd,它们是用于替换、挂载等目标的守护过程。

同样的, 咱们能够列出另一个文件系统的关上的文件

# lsof /var/log/

某些状况下,应用 df 和 du 命令雷同文件系统却显示不同磁盘应用状况,应用 losf 变得十分不便,应用 lsof 命令咱们能够找到在某些过程关上和应用时被删除的文件。

# lsof /var/log | grep -i "deleted"

下面的命令会给你被删除的文件的 pid,但它们依然存在于零碎中,处于删除状态。因而,为了开释文件系统的空间,咱们能够通过 pid 来平安地杀死这些过程。

3) 显示 lsof 命令关上的文件列表

lsof 自身抛出一个谬误音讯

# lsof lsof
lsof: status error on lsof: No such file or directory
lsof 4.87

4) 列出用户关上的文件

lsof 可用于所有已登录 Linux 零碎的用户。在这种状况下,lsof 将显示相应用户关上的所有文件。

列出 root 用户关上的所有文件

# lsof -u root | more

非 root 用户关上的文件列表,让咱们查看 linuxtechi 用户关上的所有文件

# lsof -u linuxtechi  | more
Or
# lsof -l -u linuxtechi | more

要列出除 root 外的所有关上的文件

# lsof -u ^root | more

5) 列出所有凋谢的 Internet 和 UNIX 域文件

应用 -i -U 选项列出零碎上所有关上的 internet 和 UNIX 域文件,示例如下

# lsof -i -U

6) 列出所有关上的 IPv4 网络文件

应用 -i -4 选项列出 IPv4 所有关上的网络文件

# lsof -i 4

列出特定过程所有关上的 IPv4 网络文件

语法如下 :

lsof -i 4 -a -p {process_pid}

# lsof -i 4 -a  -p 1633
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
rpcbind 1633  rpc    4u  IPv4  16576      0t0  TCP *:sunrpc (LISTEN)
rpcbind 1633  rpc    5u  IPv4  16577      0t0  UDP *:sunrpc
rpcbind 1633  rpc   10u  IPv4  16649      0t0  UDP *:960
#

7) 列出所有 IPv6 关上的网络文件

假如反对 ipv6 域,则能够应用 -i 6 选项列出关上的网络文件。

# lsof -i 6

8) 列出在特定端口上运行的所有 TCP 和 UDP 过程

语法如下:

lsof -i TCP/UDP:port

假如咱们想要列出 80 端口上运行的所有 TCP 过程,应用上面的命令

# lsof -i TCP:80
COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
httpd   2594   root    4u  IPv6  22703      0t0  TCP *:http (LISTEN)
httpd   2595 apache    4u  IPv6  22703      0t0  TCP *:http (LISTEN)
httpd   2596 apache    4u  IPv6  22703      0t0  TCP *:http (LISTEN)
httpd   2597 apache    4u  IPv6  22703      0t0  TCP *:http (LISTEN)
httpd   2598 apache    4u  IPv6  22703      0t0  TCP *:http (LISTEN)
httpd   2599 apache    4u  IPv6  22703      0t0  TCP *:http (LISTEN)
[root@linuxtechi ~]#

列出 TCP 端口范畴 (1 到 1048) 上所有关上的文件

# lsof -i TCP:1-1048

列出在特定端口上运行的所有 UDP 过程

# lsof -i UDP:16498
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
dhclient 2494 root   21u  IPv6  20952      0t0  UDP *:16498
#

留神: 要列出 linux 零碎上所有关上的 UDP 过程,请应用 lsof -i UDP 命令

9) 查看指定设施的所有关上文件

语法如下:

lsof <device-name>

查看设施 /dev/sda2 关上的文件

# lsof /dev/sda2

10) 查看 NFS 文件系统中已关上文件的过程

在某些状况下,您曾经在 linux 机器上挂载了 nfs 文件系统,然而 nfs 服务器无法访问,并且心愿列出该 nfs 文件系统上关上的所有过程

# lsof -b <nfs-share-mount-point>

11) 显示终端相干的关上文件

上面的命令用于终端上所有关上的文件

lsof /dev/tty {number}

# lsof /dev/tty1
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
bash    2442 root    0u   CHR    4,1      0t0 4689 /dev/tty1
bash    2442 root    1u   CHR    4,1      0t0 4689 /dev/tty1
bash    2442 root    2u   CHR    4,1      0t0 4689 /dev/tty1
bash    2442 root  255u   CHR    4,1      0t0 4689 /dev/tty1
#

12) 列出与应用程序关联的关上文件

假如咱们想要列出所有与 httpd 相干的关上文件

# lsof -c httpd

13) 列出所有网络连接

应用 -i 选项列出所有与网络相干的过程,示例如下

# lsof -i

14) 查看 IPv4 / IPv6 套接字文件

查看 IPv4 套接字文件

# lsof -i@192.168.1.189

通过带有一系列零的相干数字冒号模式的地址查找 IP 版本 6 的套接字文件,例如,循环地址(127.0.0.1)

# lsof -i@[::1]
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
master  2433 root   14u  IPv6  21027      0t0  TCP localhost:smtp (LISTEN)
#

15) 列出属于某个过程 ID 的所有过程

假如咱们想要列出属于特定过程 id 的所有过程,示例如下

# lsof -p 1598

16) 终止用户的所有过程

杀死所有属于 linuxtechi 用户的过程

# kill -9 `lsof -t -u linuxtechi`

17) 查看特定目录下所有关上的文件

语法如下:

lsof +D <directory-path>

列出 /var/log 目录下关上的所有文件

# lsof +D /var/log/

留神: 在下面的命令中,如果咱们应用 +D 选项,那么 lsof 将递归地列出目录中所有关上的文件,如果你不想递归地列出目录中关上的文件,那么应用 +d 选项

18) 查看谁关上日志文件(找到 PID)

上面的命令用于查找是谁关上了 /var/log/httpd/access.log 文件,以及该过程的 PID 是什么。而后用“ps -ef”命令咱们能够找到确切的用户

# lsof -t /var/log/httpd/access_log
3109
3110
3111
3112
3113
3114
#

# ps -ef | grep -E "3109|3110|3111|3112|3113|3114" | grep -v grep
or
# ps -fp "$(lsof -t /var/log/httpd/access_log | xargs echo)"
root      3109     1  0 03:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    3110  3109  0 03:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    3111  3109  0 03:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    3112  3109  0 03:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    3113  3109  0 03:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    3114  3109  0 03:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
#

我的开源我的项目

  • course-tencent-cloud(酷瓜云课堂 – gitee 仓库)
  • course-tencent-cloud(酷瓜云课堂 – github 仓库)

正文完
 0