前言
Linux 下有哪些文件
-
普通文件
-
目录
-
符号链接
-
面向块的设备文件
-
面向字符的设备文件
-
管道和命名管道
-
套接字
lsof 命令实用用法介绍
查看当前打开的所有文件
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME vi 27940 hyb 7u REG 8,15 16384 137573 /home/hyb/.1.txt.swp
lsof显示的结果,从左往右分别代表:打开该文件的程序名,进程id,用户,文件描述符,文件类型,设备,大小,iNode号,文件名。
列出被删除但占用空间的文件
$ lsof |grep deleted Xorg 1131 root 125u REG 0,5 4 61026 /memfd:xshmfence (deleted) Xorg 1131 root 126u REG 0,5 4 62913 /memfd:xshmfence (deleted) Xorg 1131 root 129u REG 0,5 4 74609 /memfd:xshmfence (deleted)
可以看到这些被删除的但仍然被打开文件,最后查找出来的时候,会被标记deleted。这个时候就可以根据实际情况分析,到底哪些文件可能过大但是却被删除了,导致空间仍然占满。
lsof | grep deleted | awk '{print $2}' | xargs -I {} kill -9 {}
恢复打开但被删除的文件
查看当前文件被哪些进程打开
查看某个目录文件被打开情况
查看当前进程打开了哪些文件
$ lsof -c hello COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME hello 29190 hyb cwd DIR 8,15 4096 134538 /home/hyb/workspaces/c hello 29190 hyb rtd DIR 8,10 4096 2 / hello 29190 hyb txt REG 8,15 9816 138314 /home/hyb/workspaces/c/hello hello 29190 hyb mem REG 8,10 1868984 939763 /lib/x86_64-linux-gnu/libc-2.23.so hello 29190 hyb mem REG 8,10 162632 926913 /lib/x86_64-linux-gnu/ld-2.23.so hello 29190 hyb 0u CHR 136,20 0t0 23 /dev/pts/20 hello 29190 hyb 1u CHR 136,20 0t0 23 /dev/pts/20 hello 29190 hyb 2u CHR 136,20 0t0 23 /dev/pts/20
我们可以从中看到,至少它用到了/lib/x86_64-linux-gnu/libc-2.23.so以及hello文件。
$ lsof -p 29190 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME hello 29190 hyb cwd DIR 8,15 4096 134538 /home/hyb/workspaces/c hello 29190 hyb rtd DIR 8,10 4096 2 / hello 29190 hyb txt REG 8,15 9816 138314 /home/hyb/workspaces/c/hello hello 29190 hyb mem REG 8,10 1868984 939763 /lib/x86_64-linux-gnu/libc-2.23.so hello 29190 hyb mem REG 8,10 162632 926913 /lib/x86_64-linux-gnu/ld-2.23.so hello 29190 hyb 0u CHR 136,20 0t0 23 /dev/pts/20 hello 29190 hyb 1u CHR 136,20 0t0 23 /dev/pts/20 hello 29190 hyb 2u CHR 136,20 0t0 23 /dev/pts/20
当然这里还有一种方式,就是利用proc文件系统,首先找到hello进程的进程id
$ ps -ef|grep hello hyb 29190 27929 0 21:14 pts/20 00:00:00 ./hello 2 hyb 29296 28848 0 21:18 pts/22 00:00:00 grep --color=auto hello
$ ls -l /proc/29190/fd lrwx------ 1 hyb hyb 64 3月 2 21:14 0 -> /dev/pts/20 lrwx------ 1 hyb hyb 64 3月 2 21:14 1 -> /dev/pts/20 lrwx------ 1 hyb hyb 64 3月 2 21:14 2 -> /dev/pts/20
这种方式能够过滤很多信息,因为它只列出了该进程实际打开的,这里它只打开了1,2,3,即标准输入,标准输出和标准错误。
查看某个端口被占用情况
$ lsof -i:6379 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME redis-ser 29389 hyb 6u IPv6 534612 0t0 TCP *:6379 (LISTEN) redis-ser 29389 hyb 7u IPv4 534613 0t0 TCP *:6379 (LISTEN)
这里可以看到redis-ser进程占用了6379端口。
查看所有的TCP/UDP连接
$ lsof -i tcp ava 2534 hyb 6u IPv6 31275 0t0 TCP localhost:9614 (LISTEN) java 2534 hyb 22u IPv6 96922 0t0 TCP localhost:9614->localhost:39004 (ESTABLISHED) java 2534 hyb 23u IPv6 249588 0t0 TCP localhost:9614->localhost:45460 (ESTABLISHED)
当然我们也可以使用netstat命令。
$ netstat -anp|grep 6379
这里的-i参数可以跟多种条件:
-
-i 4 #ipv4地址
-
-i 6 #ipv6地址
-
-i tcp #tcp连接
-
-i :3306 #端口
-
-i @ip #ip地址
查看某个用户打开了哪些文件
$ lsof -u hyb
(内容太多,省略)
列出除了某个进程或某个用户打开的文件
lsof -p ^1 #列出除进程id为1的进程以外打开的文件 lsof -u ^root #列出除root用户以外打开的文件
总结
lsof -p 1 -i tcp
lsof参数很多,具体的可以使用man命令查看,但是对于我们来说,知道这些实用的基本足够
前言
Linux 下有哪些文件
-
普通文件
-
目录
-
符号链接
-
面向块的设备文件
-
面向字符的设备文件
-
管道和命名管道
-
套接字
lsof 命令实用用法介绍
查看当前打开的所有文件
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME vi 27940 hyb 7u REG 8,15 16384 137573 /home/hyb/.1.txt.swp
lsof显示的结果,从左往右分别代表:打开该文件的程序名,进程id,用户,文件描述符,文件类型,设备,大小,iNode号,文件名。
列出被删除但占用空间的文件
$ lsof |grep deleted Xorg 1131 root 125u REG 0,5 4 61026 /memfd:xshmfence (deleted) Xorg 1131 root 126u REG 0,5 4 62913 /memfd:xshmfence (deleted) Xorg 1131 root 129u REG 0,5 4 74609 /memfd:xshmfence (deleted)
可以看到这些被删除的但仍然被打开文件,最后查找出来的时候,会被标记deleted。这个时候就可以根据实际情况分析,到底哪些文件可能过大但是却被删除了,导致空间仍然占满。
lsof | grep deleted | awk '{print $2}' | xargs -I {} kill -9 {}
恢复打开但被删除的文件
查看当前文件被哪些进程打开
查看某个目录文件被打开情况
查看当前进程打开了哪些文件
$ lsof -c hello COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME hello 29190 hyb cwd DIR 8,15 4096 134538 /home/hyb/workspaces/c hello 29190 hyb rtd DIR 8,10 4096 2 / hello 29190 hyb txt REG 8,15 9816 138314 /home/hyb/workspaces/c/hello hello 29190 hyb mem REG 8,10 1868984 939763 /lib/x86_64-linux-gnu/libc-2.23.so hello 29190 hyb mem REG 8,10 162632 926913 /lib/x86_64-linux-gnu/ld-2.23.so hello 29190 hyb 0u CHR 136,20 0t0 23 /dev/pts/20 hello 29190 hyb 1u CHR 136,20 0t0 23 /dev/pts/20 hello 29190 hyb 2u CHR 136,20 0t0 23 /dev/pts/20
我们可以从中看到,至少它用到了/lib/x86_64-linux-gnu/libc-2.23.so以及hello文件。
$ lsof -p 29190 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME hello 29190 hyb cwd DIR 8,15 4096 134538 /home/hyb/workspaces/c hello 29190 hyb rtd DIR 8,10 4096 2 / hello 29190 hyb txt REG 8,15 9816 138314 /home/hyb/workspaces/c/hello hello 29190 hyb mem REG 8,10 1868984 939763 /lib/x86_64-linux-gnu/libc-2.23.so hello 29190 hyb mem REG 8,10 162632 926913 /lib/x86_64-linux-gnu/ld-2.23.so hello 29190 hyb 0u CHR 136,20 0t0 23 /dev/pts/20 hello 29190 hyb 1u CHR 136,20 0t0 23 /dev/pts/20 hello 29190 hyb 2u CHR 136,20 0t0 23 /dev/pts/20
当然这里还有一种方式,就是利用proc文件系统,首先找到hello进程的进程id
$ ps -ef|grep hello hyb 29190 27929 0 21:14 pts/20 00:00:00 ./hello 2 hyb 29296 28848 0 21:18 pts/22 00:00:00 grep --color=auto hello
$ ls -l /proc/29190/fd lrwx------ 1 hyb hyb 64 3月 2 21:14 0 -> /dev/pts/20 lrwx------ 1 hyb hyb 64 3月 2 21:14 1 -> /dev/pts/20 lrwx------ 1 hyb hyb 64 3月 2 21:14 2 -> /dev/pts/20
这种方式能够过滤很多信息,因为它只列出了该进程实际打开的,这里它只打开了1,2,3,即标准输入,标准输出和标准错误。
查看某个端口被占用情况
$ lsof -i:6379 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME redis-ser 29389 hyb 6u IPv6 534612 0t0 TCP *:6379 (LISTEN) redis-ser 29389 hyb 7u IPv4 534613 0t0 TCP *:6379 (LISTEN)
这里可以看到redis-ser进程占用了6379端口。
查看所有的TCP/UDP连接
$ lsof -i tcp ava 2534 hyb 6u IPv6 31275 0t0 TCP localhost:9614 (LISTEN) java 2534 hyb 22u IPv6 96922 0t0 TCP localhost:9614->localhost:39004 (ESTABLISHED) java 2534 hyb 23u IPv6 249588 0t0 TCP localhost:9614->localhost:45460 (ESTABLISHED)
当然我们也可以使用netstat命令。
$ netstat -anp|grep 6379
这里的-i参数可以跟多种条件:
-
-i 4 #ipv4地址
-
-i 6 #ipv6地址
-
-i tcp #tcp连接
-
-i :3306 #端口
-
-i @ip #ip地址
查看某个用户打开了哪些文件
$ lsof -u hyb
(内容太多,省略)
列出除了某个进程或某个用户打开的文件
lsof -p ^1 #列出除进程id为1的进程以外打开的文件 lsof -u ^root #列出除root用户以外打开的文件
总结
lsof -p 1 -i tcp
lsof参数很多,具体的可以使用man命令查看,但是对于我们来说,知道这些实用的基本足够