如何使用 lsof 命令检查 Linux 中打开的文件
这是我们正在进行的Linux 命令系列,在本文中,我们将通过实际示例回顾lsof命令。lsof的意思是“LiSt Open Files”,用于找出哪个Linux 进程打开了哪些文件。
众所周知,Linux/Unix将所有内容视为文件(管道、套接字、目录、设备等)。使用lsof命令的原因之一是当磁盘无法卸载时,它会提示文件正在使用。借助lsof命令,我们可以轻松识别正在使用的文件。
1.使用 lsof 命令列出所有打开的文件
在下面的例子中,它将显示打开文件的长列表,其中一些被提取以便更好地理解,显示诸如命令、PID、用户、FD、类型等列。
# lsof COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME init 1 root cwd DIR 253,0 4096 2 / init 1 root rtd DIR 253,0 4096 2 / init 1 root txt REG 253,0 145180 147164 /sbin/init init 1 root mem REG 253,0 1889704 190149 /lib/libc-2.12.so init 1 root 0u CHR 1,3 0t0 3764 /dev/null init 1 root 1u CHR 1,3 0t0 3764 /dev/null init 1 root 2u CHR 1,3 0t0 3764 /dev/null init 1 root 3r FIFO 0,8 0t0 8449 pipe init 1 root 4w FIFO 0,8 0t0 8449 pipe init 1 root 5r DIR 0,10 0 1 inotify init 1 root 6r DIR 0,10 0 1 inotify init 1 root 7u unix 0xc1513880 0t0 8450 socket
部分及其值是不言自明的。但是,我们将更精确地查看FD 和 TYPE列。
FD – 代表文件描述符,可能会看到以下一些值:
- cwd当前工作目录
- rtd根目录
- txt程序文本(代码和数据)
- mem内存映射文件
此外,在FD中,列号(例如1u)是实际文件描述符,后面跟着u、r、w表示其模式,如下所示:
- r表示读访问。
- w代表写访问。
- u用于读写访问。
类型— 文件及其标识。
- DIR——目录
- REG——常规文件
- CHR——字符特殊文件。
- FIFO——先进先出
2.列出用户特定的打开的文件
以下命令将显示用户示例的所有打开的文件的列表。
# lsof -u example COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1838 example cwd DIR 253,0 4096 2 / sshd 1838 example rtd DIR 253,0 4096 2 / sshd 1838 example txt REG 253,0 532336 188129 /usr/sbin/sshd sshd 1838 example mem REG 253,0 19784 190237 /lib/libdl-2.12.so sshd 1838 example mem REG 253,0 122436 190247 /lib/libselinux.so.1 sshd 1838 example mem REG 253,0 255968 190256 /lib/libgssapi_krb5.so.2.2 sshd 1838 example mem REG 253,0 874580 190255 /lib/libkrb5.so.3.3
3. 查找特定端口上运行的进程
要找出特定端口上所有正在运行的 Linux 进程,只需使用以下命令并加上选项-i 。下面的示例将列出端口22上所有正在运行的进程。
# lsof -i TCP:22 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1471 root 3u IPv4 12683 0t0 TCP *:ssh (LISTEN) sshd 1471 root 4u IPv6 12685 0t0 TCP *:ssh (LISTEN)
4.仅列出 IPv4 和 IPv6 打开的文件
下面的示例仅显示使用单独的命令打开的IPv4和IPv6网络文件。
# lsof -i 4 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rpcbind 1203 rpc 6u IPv4 11326 0t0 UDP *:sunrpc rpcbind 1203 rpc 7u IPv4 11330 0t0 UDP *:954 rpcbind 1203 rpc 8u IPv4 11331 0t0 TCP *:sunrpc (LISTEN) avahi-dae 1241 avahi 13u IPv4 11579 0t0 UDP *:mdns avahi-dae 1241 avahi 14u IPv4 11580 0t0 UDP *:58600 # lsof -i 6 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rpcbind 1203 rpc 9u IPv6 11333 0t0 UDP *:sunrpc rpcbind 1203 rpc 10u IPv6 11335 0t0 UDP *:954 rpcbind 1203 rpc 11u IPv6 11336 0t0 TCP *:sunrpc (LISTEN) rpc.statd 1277 rpcuser 10u IPv6 11858 0t0 UDP *:55800 rpc.statd 1277 rpcuser 11u IPv6 11862 0t0 TCP *:56428 (LISTEN) cupsd 1346 root 6u IPv6 12112 0t0 TCP localhost:ipp (LISTEN)
5.列出 TCP 端口范围 1-1024 的打开文件
列出TCP端口1-1024的所有打开文件正在运行的进程。
# lsof -i TCP:1-1024 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rpcbind 1203 rpc 11u IPv6 11336 0t0 TCP *:sunrpc (LISTEN) cupsd 1346 root 7u IPv4 12113 0t0 TCP localhost:ipp (LISTEN) sshd 1471 root 4u IPv6 12685 0t0 TCP *:ssh (LISTEN) master 1551 root 13u IPv6 12898 0t0 TCP localhost:smtp (LISTEN) sshd 1834 root 3r IPv4 15101 0t0 TCP 192.168.0.2:ssh->192.168.0.1:conclave-cpp (ESTABLISHED) sshd 1838 example 3u IPv4 15101 0t0 TCP 192.168.0.2:ssh->192.168.0.1:conclave-cpp (ESTABLISHED) sshd 1871 root 3r IPv4 15842 0t0 TCP 192.168.0.2:ssh->192.168.0.1:groove (ESTABLISHED) httpd 1918 root 5u IPv6 15991 0t0 TCP *:http (LISTEN) httpd 1918 root 7u IPv6 15995 0t0 TCP *:https (LISTEN)
6. 使用‘^’字符排除用户
这里,我们排除了root用户。您可以使用上面命令中的“^”排除特定用户。
# lsof -i -u^root COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rpcbind 1203 rpc 6u IPv4 11326 0t0 UDP *:sunrpc rpcbind 1203 rpc 7u IPv4 11330 0t0 UDP *:954 rpcbind 1203 rpc 8u IPv4 11331 0t0 TCP *:sunrpc (LISTEN) rpcbind 1203 rpc 9u IPv6 11333 0t0 UDP *:sunrpc rpcbind 1203 rpc 10u IPv6 11335 0t0 UDP *:954 rpcbind 1203 rpc 11u IPv6 11336 0t0 TCP *:sunrpc (LISTEN) avahi-dae 1241 avahi 13u IPv4 11579 0t0 UDP *:mdns avahi-dae 1241 avahi 14u IPv4 11580 0t0 UDP *:58600 rpc.statd 1277 rpcuser 5r IPv4 11836 0t0 UDP *:soap-beep rpc.statd 1277 rpcuser 8u IPv4 11850 0t0 UDP *:55146 rpc.statd 1277 rpcuser 9u IPv4 11854 0t0 TCP *:32981 (LISTEN) rpc.statd 1277 rpcuser 10u IPv6 11858 0t0 UDP *:55800 rpc.statd 1277 rpcuser 11u IPv6 11862 0t0 TCP *:56428 (LISTEN)
7. 找出谁在查看什么文件和命令?
下面的例子显示用户示例正在使用像ping和/etc目录这样的命令。
# lsof -i -u example COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 1839 example cwd DIR 253,0 12288 15 /etc ping 2525 example cwd DIR 253,0 12288 15 /etc
8.列出所有网络连接
以下命令带有选项“-i”,显示所有“ LISTENING & ESTABLISHED”网络连接的列表。
# lsof -i COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rpcbind 1203 rpc 6u IPv4 11326 0t0 UDP *:sunrpc rpcbind 1203 rpc 7u IPv4 11330 0t0 UDP *:954 rpcbind 1203 rpc 11u IPv6 11336 0t0 TCP *:sunrpc (LISTEN) avahi-dae 1241 avahi 13u IPv4 11579 0t0 UDP *:mdns avahi-dae 1241 avahi 14u IPv4 11580 0t0 UDP *:58600 rpc.statd 1277 rpcuser 11u IPv6 11862 0t0 TCP *:56428 (LISTEN) cupsd 1346 root 6u IPv6 12112 0t0 TCP localhost:ipp (LISTEN) cupsd 1346 root 7u IPv4 12113 0t0 TCP localhost:ipp (LISTEN) sshd 1471 root 3u IPv4 12683 0t0 TCP *:ssh (LISTEN) master 1551 root 12u IPv4 12896 0t0 TCP localhost:smtp (LISTEN) master 1551 root 13u IPv6 12898 0t0 TCP localhost:smtp (LISTEN) sshd 1834 root 3r IPv4 15101 0t0 TCP 192.168.0.2:ssh->192.168.0.1:conclave-cpp (ESTABLISHED) httpd 1918 root 5u IPv6 15991 0t0 TCP *:http (LISTEN) httpd 1918 root 7u IPv6 15995 0t0 TCP *:https (LISTEN) clock-app 2362 narad 21u IPv4 22591 0t0 TCP 192.168.0.2:45284->www.gov.com:http (CLOSE_WAIT) chrome 2377 narad 61u IPv4 25862 0t0 TCP 192.168.0.2:33358->maa03s04-in-f3.1e100.net:http (ESTABLISHED) chrome 2377 narad 80u IPv4 25866 0t0 TCP 192.168.0.2:36405->bom03s01-in-f15.1e100.net:http (ESTABLISHED)
9. 按PID搜索
下面的例子只显示PID为1的[一]。
# lsof -p 1 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME init 1 root cwd DIR 253,0 4096 2 / init 1 root rtd DIR 253,0 4096 2 / init 1 root txt REG 253,0 145180 147164 /sbin/init init 1 root mem REG 253,0 1889704 190149 /lib/libc-2.12.so init 1 root mem REG 253,0 142472 189970 /lib/ld-2.12.so
10. 终止特定用户的所有活动
有时您可能需要终止特定用户的所有进程。以下命令将终止示例用户的所有进程。
# kill -9 `lsof -t -u example`
注意:这里不可能给出所有可用选项的示例,本指南仅用于展示如何使用lsof命令。您可以参考lsof命令的手册页以了解更多信息。如果您发现本文有用,请通过下面的评论框分享。