喜讯!TCMS 官网正式上线!一站式提供企业级定制研发、App 小程序开发、AI 与区块链等全栈软件服务,助力多行业数智转型,欢迎致电:13888011868 QQ 932256355 洽谈合作!
本文全面解析类Unix系统中`lsof`(List Open Files)命令的用法,涵盖基础语法、参数详解、进程管理(PID获取、启停、重启)及实战场景。无论是通过进程名/路径获取PID,还是排查端口占用、磁盘空间问题,都能通过本文掌握`lsof`的实用技巧,适合系统管理员与开发人员提升系统调试效率。

在类Unix系统中,lsof(List Open Files)是一款功能强大的命令行工具,可列出系统中所有打开的“文件”(包括普通文件、目录、网络套接字等)。本文在原有基础上补充进程PID获取、进程启停操作及完整参数说明,助你更全面地运用lsof解决实际问题。
lsof [选项] [文件名/参数]COMMAND(进程名)、PID(进程ID)、USER(用户)、FD(文件描述符)、TYPE(文件类型)、NAME(路径/网络信息)等。在实际工作中,常需通过进程名、运行路径等获取PID,再进行启停或重启操作。lsof结合其他命令可高效完成这些任务。
场景:已知进程名(如nginx、java),需获取其PID。 方法:使用-c选项匹配进程名,结合-t仅输出PID。
# 获取所有进程名含nginx的PID
lsof -t -cnginx
# 示例输出(多个PID分行显示)
1234
1235场景:已知进程的可执行文件路径(如/usr/bin/nginx),需定位其PID。 方法:直接指定路径作为参数,结合-t输出PID。
# 根据可执行文件路径获取PID
lsof -t/usr/bin/nginx
# 示例输出
1234场景:获取PID后,终止异常进程。 方法:结合kill命令批量操作。
# 杀死所有进程名含nginx的进程
kill -9 $(lsof -t -c nginx)
# 杀死指定路径进程(如/usr/bin/java)
kill -9 $(lsof -t /usr/bin/java)场景:修改配置后需重启进程(以nginx为例)。 方法:先停止进程,再启动(不同服务启动方式不同)。
# 停止nginx
kill -9 $(lsof -t -c nginx)
# 启动nginx(根据实际路径调整)
/usr/bin/nginx以下按参数格式顺序,简要说明每个选项的作用及示例:
| 参数 | 作用 | 示例 |
|---|---|---|
-? | 显示简短帮助 | lsof -? |
-a | 多选项逻辑与(默认是或) | lsof -u root -a -c nginx(root用户且进程名含nginx) |
-b | 避免阻塞操作 | lsof -b +D /mnt/network(查看网络目录时不阻塞) |
-C | 不显示进程名版本后缀 | lsof -C -c nginx-1.21(显示为nginx) |
-h | 压缩重复输出 | lsof -h -i :80(省略重复的进程名/PID) |
-l | 显示UID而非用户名 | lsof -l -u 1000(USER列显示1000) |
-n | 不解析IP为域名 | lsof -n -i(显示IP而非域名) |
-N | 显示NFS相关文件 | lsof -N /mnt/nfs(查看NFS挂载文件) |
-O | 不显示文件偏移量 | lsof -O -p 1234(隐藏SIZE/OFF列) |
-P | 不解析端口为服务名 | lsof -P -i(显示80而非http) |
-R | 显示父进程PID(PPID) | lsof -R -c nginx(多一列PPID) |
-t | 仅输出PID | lsof -t -i :80(仅返回80端口的PID) |
-U | 显示UNIX域套接字 | lsof -U(列出所有UNIX套接字) |
-v | 显示版本信息 | lsof -v |
-V | 显示详细版本与配置 | lsof -V |
-X | 排除网络文件 | lsof -X -p 1234(仅显示本地文件) |
-A A | 限制文件描述符类型 | lsof -A p -c nginx(仅显示管道文件) |
-c c | 按进程名前缀筛选 | lsof -c nginx(进程名以nginx开头) |
+c c | 限制进程名显示长度 | lsof +c 5 -c nginx(进程名最多显示5个字符) |
+|-d d | 按文件描述符筛选(+包含,-排除) | lsof +d 0-2(包含FD 0-2);lsof -d 3(排除FD 3) |
+|-D D | 按目录筛选(+递归,-非递归) | lsof +D /var/log(递归目录);lsof -D /var(非递归) |
+|-e s | 排除文件系统(+包含,-排除) | lsof -e /proc(排除/proc文件系统) |
+|-E | 显示/隐藏进程环境变量 | lsof +E -p 1234(显示进程1234的环境变量) |
+|-f [cfgGn] | 控制文件系统信息显示 | lsof +f g -i(显示网络文件的GID) |
-F [f] | 自定义输出格式(f为字段,如p=PID) | lsof -F pn -i :80(输出PID和文件名) |
-g [s] | 按进程组ID(PGID)筛选 | lsof -g 123(PGID为123的进程) |
-i [i] | 筛选网络连接 | lsof -i tcp:80(TCP 80端口) |
-k k | 按内核态线程筛选 | lsof -k 1(仅显示内核线程) |
-K k | 按线程ID(TID)筛选 | lsof -K 456(TID为456的线程) |
+|-L [l] | 按链接数筛选(+小于l,-大于l) | lsof +L1(链接数小于1,即已删除文件) |
+|-m m | 按内存映射筛选 | lsof +m /dev/shm(包含/dev/shm的内存映射) |
+|-M | 显示/隐藏NFS挂载点信息 | lsof +M -N(显示NFS挂载点详情) |
-o [o] | 显示文件偏移量(o为精度) | lsof -o 3 -p 1234(偏移量保留3位小数) |
-p s | 按PID筛选 | lsof -p 1234,5678(PID为1234和5678的进程) |
+|-r [t] | 周期性刷新(+持续,-一次;t为秒) | lsof -r 2 -i :80(每2秒刷新80端口) |
-s [p:s] | 按网络状态筛选 | lsof -i tcp -sTCP:LISTEN(TCP监听状态) |
-S [t] | 设置网络超时(t秒) | lsof -i @remote -S 5(超时5秒) |
-T [t] | 显示TCP信息(t为类型,如q=序列号) | lsof -i tcp -T q(显示TCP序列号) |
-u s | 按用户筛选 | lsof -u root,www-data(root和www-data用户) |
+|-w | 显示/隐藏警告信息 | lsof -w -i(不显示警告) |
-x [fl] | 显示文件锁信息(f=文件,l=锁) | lsof -x f -p 1234(进程1234的文件锁) |
+|-X | 包含/排除X11相关文件 | lsof -X(排除X11文件) |
-z [z] | 按UID/GID范围筛选 | lsof -z 1000-2000(UID 1000-2000) |
-Z [Z] | 显示SELinux上下文 | lsof -Z -i :80(80端口的SELinux上下文) |
-- | 分隔选项与文件名 | lsof -- -i(查看名为“-i”的文件) |
[names] | 文件名/路径 | lsof /var/log/syslog(查看打开该文件的进程) |
# 查找80端口占用进程
lsof -i:80
# 杀死占用进程
kill -9 $(lsof -t -i :80)# 找到已删除但被占用的文件
lsof +L1
# 重启占用进程释放空间
systemctl restart $(lsof -t +L1 | xargs ps -p | awk 'NR>1 {print $4}')# 查找占用/var/www的进程
lsof +D /var/www
# 终止进程后删除目录
kill -9 $(lsof -t +D /var/www)&& rm -rf/var/www# 实时监控testuser的TCP连接(每3秒刷新)
lsof -nP -itcp -utestuser -r 3lsof命令的核心价值在于关联进程、文件与网络,通过本文补充的PID获取和进程管理技巧,可进一步提升系统调试效率。无论是通过进程名/路径定位PID,还是结合参数排查端口、磁盘问题,灵活运用lsof的选项组合(如-c+-t、+L1、-i)都能快速解决实际问题。完整参数可通过man lsof深入学习,逐步掌握这一“系统排查瑞士军刀”。