Linux LSOF命令与示例

时间:2020-03-05 15:28:52  来源:igfitidea点击:

lsof命令代表'列表打开文件'。
找出有关已打开的文件的详细信息以及其各自流程是非常有用的。
在此命令的帮助下,我们可以监视系统实际发生的系统,并找出有关在某些特定分区中打开的文件的详细信息。

在本教程中,我列出了使用示例的LSOF命令的常见用法。

1)列出由特定文件打开的进程

为了列出由某些特定文件打开的进程,只需运行lsof命令,然后运行文件路径。

例如:要查看由/var/log/messages文件打开的进程,只需运行:

# lsof /var/log/messages

示例输出:

# lsof /var/log/messages
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsyslogd 1395 root 3w REG 202,0 59932 17322 /var/log/messages

2)使用挂载点/分区列出进程

在尝试卸载某些分区时,我们可能已经看到"设备或者资源繁忙"错误,因此它发生,因为某些其他进程仍然使用该特定分区或者装入点。
我们需要使用LSOF来查找这些进程并在成功卸载分区之前杀死它们。
为了查看哪些进程使用某些特定分区,请使用lsof命令后跟分区名称如下:

# lsof /run

示例输出:

# lsof /run
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd-j 1065 root mem REG 0,17 6488064 1362725 /run/log/journal/72863e389b584a4dab36fae7f3bffda2/system.journal
systemd-j 1065 root mem REG 0,17 8 810 /run/systemd/journal/kernel-seqnum
systemd-j 1065 root 12u REG 0,17 6488064 1362725 /run/log/journal/72863e389b584a4dab36fae7f3bffda2/system.journal
systemd-u 1078 root 6u REG 0,17 8 3703 /run/udev/queue.bin
NetworkMa 1388 root 20w FIFO 0,17 0t0 3912 /run/systemd/inhibit/1.ref
rsyslogd 1395 root mem REG 0,17 6488064 1362725 /run/log/journal/72863e389b584a4dab36fae7f3bffda2/system.journal

3)列出某些特定用户打开的文件

为了查看某些特定用户打开的文件列表,请使用"-u"选项以及LSOF Commad。

# lsof –u username
# lsof -u root
COMMAND     PID USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
systemd       1 root  cwd       DIR              202,0      4096          2 /
systemd       1 root  rtd       DIR              202,0      4096          2 /
systemd       1 root  txt       REG              202,0   1214424       9632 /usr/lib/systemd/systemd
systemd       1 root  mem       REG              202,0     58288      17357 /usr/lib64/libnss_files-2.17.so
systemd       1 root  mem       REG              202,0     90632       9967 /usr/lib64/libz.so.1.2.7
systemd       1 root  mem       REG              202,0     19888       9738 /usr/lib64/libattr.so.1.1.0
systemd       1 root  mem       REG              202,0    113320      17354 /usr/lib64/libnsl-2.17.so
systemd       1 root  mem       REG              202,0    153184       9838 /usr/lib64/liblzma.so.5.0.99
systemd       1 root  mem       REG              202,0    398264       9898 /usr/lib64/libpcre.so.1.2.0
systemd       1 root  mem       REG              202,0     19512      17350 /usr/lib64/libdl-2.17.so
systemd       1 root  mem       REG              202,0   2107600       9733 /usr/lib64/libc-2.17.so
systemd       1 root  mem       REG              202,0    141616       9877 /usr/lib64/libpthread-2.17.so
systemd       1 root  mem       REG              202,0     88720      17522 /usr/lib64/libgcc_s-4.8.2-20140120.so.1
systemd       1 root  mem       REG              202,0    304536       9762 /usr/lib64/libdbus-1.so.3.7.4
systemd       1 root  mem       REG              202,0     44048      17367 /usr/lib64/librt-2.17.so

4)找出使用某些特定端口的流程

很多时候我们发现某些服务不能绑定到端口,因为端口已被其他进程使用。
在这种情况下,有必要使用端口找到该过程并杀死它。
这是一个可能有帮助的一个例子:

# lsof -i :25

5)列出网络连接

我们可以使用LSOF列出网络连接。
使用"选项"我'以及LSOF查看这些细节。

# lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
avahi-dae 1383 avahi 12u IPv4 3397 0t0 UDP *:mdns
avahi-dae 1383 avahi 13u IPv4 3398 0t0 UDP *:53376
chronyd 1393 chrony 1u IPv4 2712 0t0 UDP *:ntp
chronyd 1393 chrony 2u IPv6 2713 0t0 UDP *:ntp
chronyd 1393 chrony 3u IPv4 2714 0t0 UDP localhost:323
chronyd 1393 chrony 5u IPv6 2715 0t0 UDP localhost:323
dhclient 1497 root 6u IPv4 4179 0t0 UDP *:bootpc
dhclient 1497 root 20u IPv4 4151 0t0 UDP *:24561
dhclient 1497 root 21u IPv6 4152 0t0 UDP *:20528
sshd 1707 root 3u IPv4 4897 0t0 TCP *:ssh (LISTEN)
sshd 1707 root 4u IPv6 4908 0t0 TCP *:ssh (LISTEN)
sshd 25453 root 3u IPv4 1601772 0t0 TCP li978-9.members.linode.com:ssh->182.188.228.74:casp (ESTABLISHED)

6)找出某些特定守护程序打开的文件

要显示特定守护程序打开的所有文件,请使用lsof使用选项'c',后跟守护程序名称。

# lsof –c mysql
mysqld 991 admin cwd DIR 8,3 240 148743 /home/admin/novell/idm/mysql/data
mysqld 991 admin rtd DIR 8,3 536 2 /
mysqld 991 admin txt REG 8,3 5464060 148691 /home/admin/novel/bin/mysqld
mysqld 991 admin 0r CHR 1,3 41715 /dev/null
mysqld 991 admin 1w REG 8,3 1250 149954 /home/admin/novell/mysql/mysql.log
mysqld 991 admin 2w REG 8,3 1250 149954 /home/admin/novell/mysql/mysql.log
mysqld 991 admin 3u IPv4 86990 TCP

7)按进程ID列出所有打开的文件

我们可以使用"P"以及LSOF命令一起使用选项"p"来查找由任何特定进程打开的文件列表。

# lsof -p PID

用进程ID替换PID。

# lsof -p 484
COMMAND   PID USER   FD      TYPE DEVICE SIZE/OFF NODE NAME
fsnotify_ 484 root  cwd       DIR  202,0     4096    2 /
fsnotify_ 484 root  rtd       DIR  202,0     4096    2 /
fsnotify_ 484 root  txt   unknown                      /proc/484/exe

8)杀死某些特定用户的流程

我们可以使用以下命令杀死属于某些特定用户的所有进程,用实际用户名替换用户名:

# kill -9 `lsof -t -u USERNAME

9)找出端口和服务映射

我们可以使用LSOF命令在Linux系统上找到端口及其附属服务映射。
以下命令将显示IPv4网络接口上各种运行服务及其关联端口的映射详细信息:

# lsof -Pnl +M -i4
# lsof -Pnl +M -i4
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
avahi-dae 1383 70 12u IPv4 3397 0t0 UDP *:5353
avahi-dae 1383 70 13u IPv4 3398 0t0 UDP *:53376
chronyd 1393 998 1u IPv4 2712 0t0 UDP *:123
chronyd 1393 998 3u IPv4 2714 0t0 UDP 127.0.0.1:323
dhclient 1497 0 6u IPv4 4179 0t0 UDP *:68
dhclient 1497 0 20u IPv4 4151 0t0 UDP *:24561
sshd 1707 0 3u IPv4 4897 0t0 TCP *:22 (LISTEN)
sshd 25453 0 3u IPv4 1601772 0t0 TCP 45.33.24.9:22->182.188.228.74:1130 (ESTABLISHED)
sshd 25549 0 3u IPv4 1602514 0t0 TCP 45.33.24.9:22->115.230.126.149:60138 (ESTABLISHED)
sshd 25550 74 3u IPv4 1602514 0t0 TCP 45.33.24.9:22->115.230.126.149:60138 (ESTABLISHED)

以下命令将显示IPv6网络接口的映射信息:

# lsof -Pnl +M -i6
[root@localhost ~]# lsof -Pnl +M -i6
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
chronyd 1393 998 2u IPv6 2713 0t0 UDP *:123
chronyd 1393 998 5u IPv6 2715 0t0 UDP [::1]:323
dhclient 1497 0 21u IPv6 4152 0t0 UDP *:20528
sshd 1707 0 4u IPv6 4908 0t0 TCP *:22 (LISTEN)
[root@localhost ~]# lsof -Pnl +M -i4

10)查找由未知端口运行的程序

要检查系统上是否存在任何可疑端口,只需运行netstat命令。

# netstat –an
udp 0 0 0.0.0.0:32853 0.0.0.0:*
udp 0 0 0.0.0.0:56655 0.0.0.0:*
udp 0 0 0.0.0.0:5500 0.0.0.0:*
udp 0 0 0.0.0.0:78 0.0.0.0:*

从上面的结果,我们可以看到端口5500未知。
因此,我们可以使用以下命令使用端口找到程序:

# lsof -i udp:5500

11)查看所有TCP或者UDP连接

使用以下命令在Linux系统上查看TCP和UDP连接:

# lsof -i tcp; lsof -i udp;
# lsof -i tcp; lsof -i udp;
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1707 root 3u IPv4 4897 0t0 TCP *:ssh (LISTEN)
sshd 1707 root 4u IPv6 4908 0t0 TCP *:ssh (LISTEN)
sshd 25453 root 3u IPv4 1601772 0t0 TCP li978-9.members.linode.com:ssh->182.188.228.74:casp (ESTABLISHED)
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
avahi-dae 1383 avahi 12u IPv4 3397 0t0 UDP *:mdns
avahi-dae 1383 avahi 13u IPv4 3398 0t0 UDP *:53376
chronyd 1393 chrony 1u IPv4 2712 0t0 UDP *:ntp
chronyd 1393 chrony 2u IPv6 2713 0t0 UDP *:ntp
chronyd 1393 chrony 3u IPv4 2714 0t0 UDP localhost:323
chronyd 1393 chrony 5u IPv6 2715 0t0 UDP localhost:323
dhclient 1497 root 6u IPv4 4179 0t0 UDP *:bootpc
dhclient 1497 root 20u IPv4 4151 0t0 UDP *:24561
dhclient 1497 root 21u IPv6 4152 0t0 UDP *:20528

12)以重复模式运行LSOF

我们也可以在重复模式下运行LSOF,这意味着它将显示结果一次,然后休息几秒钟,然后它将在上述间隔内再次显示更新的结果。
它对于故障排除的Linux系统性能问题非常有用。

运行lsof命令后跟"-r"选项和延迟间隔以秒为单位。
找到一个例子

每3秒关注用户活动

# lsof -r 3 -u username