lsof(list open files)命令是用于查看系统中打开文件的工具,可以列出当前系统打开的所有文件(包括文件、文件夹、网络连接等),可以帮助我们查找一些占用磁盘空间或者占用网络带宽的进程。
查看lsof命令的help帮助信息
[root@jeven ~]# lsof --help
lsof: illegal option character: -
lsof: -e not followed by a file system path: "lp"
lsof 4.87
latest revision: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/
latest FAQ: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ
latest man page: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/lsof_man
usage: [-?abhKlnNoOPRtUvVX] [+|-c c] [+|-d s] [+D D] [+|-f[gG]] [+|-e s]
[-F [f]] [-g [s]] [-i [i]] [+|-L [l]] [+m [m]] [+|-M] [-o [o]] [-p s]
[+|-r [t]] [-s [p:s]] [-S [t]] [-T [t]] [-u s] [+|-w] [-x [fl]] [--] [names]
Defaults in parentheses; comma-separated set (s) items; dash-separated ranges.
-?|-h list help -a AND selections (OR) -b avoid kernel blocks
-c c cmd c ^c /c/[bix] +c w COMMAND width (9) +d s dir s files
-d s select by FD set +D D dir D tree *SLOW?* +|-e s exempt s *RISKY*
-i select IPv[46] files -K list tasKs (threads) -l list UID numbers
-n no host names -N select NFS files -o list file offset
-O no overhead *RISKY* -P no port names -R list paRent PID
-s list file size -t terse listing -T disable TCP/TPI info
-U select Unix socket -v list version info -V verbose search
+|-w Warnings (+) -X skip TCP&UDP* files -Z Z context [Z]
-- end option scan
+f|-f +filesystem or -file names +|-f[gG] flaGs
-F [f] select fields; -F? for help
+|-L [l] list (+) suppress (-) link counts < l (0 = all; default = 0)
+m [m] use|create mount supplement
+|-M portMap registration (-) -o o o 0t offset digits (8)
-p s exclude(^)|select PIDs -S [t] t second stat timeout (15)
-T qs TCP/TPI Q,St (s) info
-g [s] exclude(^)|select and print process group IDs
-i i select by IPv[46] address: [46][proto][@host|addr][:svc_list|port_list]
+|-r [t[m<fmt>]] repeat every t seconds (15); + until no files, - forever.
An optional suffix to t is m<fmt>; m must separate t from <fmt> and
<fmt> is an strftime(3) format for the marker line.
-s p:s exclude(^)|select protocol (p = TCP|UDP) states by name(s).
-u s exclude(^)|select login|UID set s
-x [fl] cross over +d|+D File systems or symbolic Links
names select named files or files on named file systems
Anyone can list all files; /dev warnings disabled; kernel ID check disabled.
lsof [选项] [文件、目录名或进程ID]
-a:列出打开文件存在的进程;
-c<进程名>:列出指定进程所打开的文件;
-g:列出GID号进程详情;
-d<文件号>:列出占用该文件号的进程;
+d<目录>:列出目录下被打开的文件;
+D<目录>:递归列出目录下被打开的文件;
-n<目录>:列出使用NFS的文件;
-i<条件>:列出符合条件的进程(协议、:端口、 @ip )
-p<进程号>:列出指定进程号所打开的文件;
-u:列出UID号进程详情;
-h:显示帮助信息;
-v:显示版本信息
使用lsof命令可以列出当前系统中打开的所有文件和网络连接,包括哪些进程打开了哪些文件、哪些网络连接被哪些进程使用等等。
lsof
command PID USER FD type DEVICE SIZE NODE NAME
COMMAND列:打开文件的进程的名称。
PID列:打开文件的进程的标识符。
USER列:打开文件的进程的所有者。
FD列:打开文件的进程的文件描述符。
TYPE列:打开文件的类型,如REG(常规文件)、DIR(目录)、CHR(字符设备)、FIFO(管道)、SOCK(套接字)等。
DEVICE列:打开文件所在的设备的编号。
SIZE/OFF列:文件的大小或偏移量。
NODE列:打开文件的节点号码。
NAME列:打开文件的路径和文件名。
例如查询sshd服务进程的PID号
[root@jeven ~]# ps aux |grep ssh
root 9347 0.0 0.0 112756 4312 ? Ss 06:22 0:00 /usr/sbin/sshd -D
root 30102 0.0 0.0 161316 6052 ? Ss 17:14 0:00 sshd: root@pts/1
root 30109 0.0 0.0 161312 6040 ? Ss 17:14 0:00 sshd: root@notty
root 30154 0.0 0.0 74176 2940 ? Ss 17:14 0:00 /usr/libexec/openssh/sftp-server
root 31429 0.0 0.0 112712 968 pts/1 S+ 18:57 0:00 grep --color=auto ssh
使用lsof查询该进程打开的所有文件
lsof -p 9347
查看某个用户打开的所有文件
[root@jeven ~]# lsof -u apache |head
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
httpd 31674 apache cwd DIR 253,0 278 64 /
httpd 31674 apache rtd DIR 253,0 278 64 /
httpd 31674 apache txt REG 253,0 527736 8888916 /usr/sbin/httpd
httpd 31674 apache mem REG 253,0 37216 9300529 /usr/lib64/libnss_sss.so.2
httpd 31674 apache mem REG 253,0 105824 8467438 /usr/lib64/libresolv-2.17.so
httpd 31674 apache mem REG 253,0 31408 8467426 /usr/lib64/libnss_dns-2.17.so
httpd 31674 apache mem REG 253,0 61624 8467428 /usr/lib64/libnss_files-2.17.so
httpd 31674 apache mem REG 253,0 27720 51070491 /usr/lib64/httpd/modules/mod_cgi.so
httpd 31674 apache mem REG 253,0 68192 8541901 /usr/lib64/libbz2.so.1.0.6
查看某个文件被哪些进程打开
[root@jeven ~]# lsof /usr/sbin/httpd
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
httpd 31673 root txt REG 253,0 527736 8888916 /usr/sbin/httpd
httpd 31674 apache txt REG 253,0 527736 8888916 /usr/sbin/httpd
httpd 31675 apache txt REG 253,0 527736 8888916 /usr/sbin/httpd
httpd 31676 apache txt REG 253,0 527736 8888916 /usr/sbin/httpd
httpd 31677 apache txt REG 253,0 527736 8888916 /usr/sbin/httpd
httpd 31678 apache txt REG 253,0 527736 8888916 /usr/sbin/httpd
查看所有网络连接
lsof -i
查看某个端口被哪些进程占用
[root@jeven ~]# lsof -i :22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 9347 root 3u IPv4 59897 0t0 TCP *:ssh (LISTEN)
sshd 9347 root 4u IPv6 59899 0t0 TCP *:ssh (LISTEN)
sshd 30102 root 3u IPv4 259806 0t0 TCP jeven.dhcp-route:ssh->DESKTOP-R1B8FG7.dhcp-route:58104 (ESTABLISHED)
sshd 30109 root 3u IPv4 258689 0t0 TCP jeven.dhcp-route:ssh->DESKTOP-R1B8FG7.dhcp-route:58107 (ESTABLISHED)
查看某个目录下被哪些进程打开的文件
[root@jeven ~]# lsof +D /tmp
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
fastgithu 8959 root mem-R REG 253,0 4096 1017250 /tmp/.dotnet/shm/global/FastGithub
fastgithu 8959 root 8u unix 0xffff930eaf1e5800 0t0 52317 /tmp/dotnet-diagnostic-8959-1410-socket
fastgithu 8959 root 108r DIR 253,0 20 219680441 /tmp/.dotnet/shm
fastgithu 8959 root 109uR REG 253,0 4096 1017250 /tmp/.dotnet/shm/global/FastGithub
postmaste 9582 postgres 9u unix 0xffff930d35c18800 0t0 66632 /tmp/.s.PGSQL.5432
X 9603 root 8u unix 0xffff930d32916000 0t0 65977 /tmp/.X11-unix/X0
gnome-ses 12391 gdm 13u unix 0xffff930d2c1e7c00 0t0 69454 /tmp/.ICE-unix/12391
查看打开某个类型文件的进程列表
[root@jeven ~]# lsof -t /usr/sbin/httpd
31673
31674
31675
31676
31677
31678
需要root权限才能使用lsof命令。
lsof命令需要一定时间才能完成扫描,因此不应在生产环境下滥用。
使用lsof命令时应确保使用的是最新版本,以防止出现已知的bug。
使用时应仔细查看命令输出,尤其是对于打开套接字的程序及其连接,以避免意外暴露敏感信息。
lsof命令的扫描范围包括所有已打开的文件和网络套接字,因此执行时可能会对系统性能产生一定的影响,如果对性能敏感,应考虑使用其他更轻量级的工具。
在使用lsof命令时,应确保已经对电脑进行了必要的安全保护,以避免受到黑客攻击或数据泄露。