各位运维大佬新年好啊,大家开工没啊?领了多少开工红包啊?上班了就要收收心,结束假期懒散的心态了,要赶紧学习起来,争取今年换个好工作呀!高薪是靠跳槽跳出来的!你入职时的能力,已经在老板心目中固化了,哪怕你再努力学习新知识,这话很扎心,却是我多年运维工作的经验之谈。所以,学会可以有更高薪资的技能之后就跳吧!真的。闲话少扯,言归正传。作为Linux运维,很多人应该遇到过这些糟心场景:卸载挂载点时,提示设备在忙,却找不到哪个进程在占用;部署服务时,端口被占用报错,翻遍日志也找不到元凶;删除文件时,提示权限不足,明明权限没问题……遇到这些情况,很多人会第一时间想到lsof命令,但其实还有一个更轻量、更精准的进程定位神器:fuser。通过文件/目录/端口找进程,操作简洁、响应快速,非常适合生产环境的应急排查。fuser(File User)的核心功能,就是识别哪些进程正在使用指定的文件、目录或网络端口,并能直接对这些进程进行操作(如终止)。对挂载点、网络端口的排查支持更精准,尤其适合应急场景。fuser [选项] 目标资源(文件/目录/端口)
目标资源可以是:具体文件(如/var/log/messages)、目录(如/home)、挂载点(如/mnt/data)、网络端口(如80/tcp)。fuser的选项不多,但每一个都很实用,重点记以下几个:-v 详细模式,显示进程ID、用户名、访问方式、命令名称,查看进程详细信息,避免误操作-u 在进程ID后显示所属用户名,排查多用户服务器,确认进程归属-k 终止所有访问目标资源的进程(默认发送SIGKILL信号)快速终止占用资源的进程(生产环境一定要谨慎使用!)-i 与-k联用时,终止每个进程前进行交互式确认,降低误杀风险-m 针对指定的文件系统或挂载点排查,而非单个文件,卸载挂载点时,排查占用进程-n 指定命名空间,用于排查网络端口(如tcp、udp),端口被占用时,定位占用进程-l 列出fuser可用的信号名称(如SIGTERM、SIGKILL),需要发送特定信号终止进程时查询光说不练没鸟用,重点是实战场景,下面简单讲几个实例,大佬别喷。1:排查文件被哪个进程占用,高频需求:日志文件(如/var/log/messages)无法删除、修改,提示被占用,需定位具体进程。# 基础用法:只显示占用文件的进程PIDfuser /var/log/messages# 推荐用法:显示详细信息(用户、PID、命令)fuser -v /var/log/messages# 显示进程归属用户fuser -uv /var/log/messages
# 核心命令:-m选项排查挂载点占用进程fuser -mv /mnt/data# 终止占用进程(生产环境建议加-i确认)fuser -mivk /mnt/data
注意:终止进程前,需确认进程是否关联业务(如python进程可能是应用进程),避免终止后影响业务。3:端口被占用,定位占用进程,部署应用时时,提示端口被占用,快速定位并处理。# 排查TCP端口80的占用进程(-n指定tcp命名空间)fuser -v -n tcp 80# 排查UDP端口53(DNS服务)的占用进程fuser -v -n udp 53# 快速终止TCP 80端口的占用进程(谨慎)fuser -k -n tcp 80
如果需要“温柔终止”进程(让进程正常退出,避免数据丢失),可先查询信号,再发送SIGTERM信号: #列出可用信号fuser -l# 发送SIGTERM信号终止80端口占用进程fuser -k -SIGTERM -n tcp 80
# 终止占用/test目录的所有进程(直接强制终止)fuser -k /test# 终止前交互式确认(生产环境推荐)fuser -ik /test# 终止时显示进程所属用户,便于确认fuser -iuk /test
注意:-k选项默认发送SIGKILL信号(强制终止),可能导致进程数据丢失,生产环境务必搭配-i选项确认。5:查看被删除但仍被占用的文件进程,比如文件已被删除,但磁盘空间未释放,原因是进程仍持有该文件的句柄,此时可用fuser排查。# 排查/var/log目录下,已删除但仍被占用的文件进程fuser -dv /var/log
输出中会显示被删除文件的相关进程,终止这些进程后,磁盘空间即可释放。6:静默模式排查,仅用于脚本执行,在运维脚本中,排查资源占用情况,无需输出信息,仅通过返回值判断是否有进程占用。# 静默模式,不显示输出,仅返回进程PID(脚本中常用)fuser -s /mnt/data# 结合脚本判断:如果有进程占用,返回0,否则返回非0if fuser -s /mnt/data; then echo "挂载点被占用,无法卸载"else umount /mnt/data
fuser虽然好用,但如果操作不当,可能导致业务中断、数据丢失。特别要谨慎使用-k选项,建议先执行fuser -v查看进程详情,确认可终止后再操作,优先搭配-i选项确认。