Linux LSOF命令与示例
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