You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在shell脚本中提取fuser命令输出的PID列值并杀死对应进程

实现方案

方案1:直接使用fuser内置kill功能(最简便)

fuser本身支持-k参数直接杀死匹配到的进程,无需额外提取PID,命令格式如下:

# 语法:fuser -k -<信号> <目标资源>
# 示例1:杀死占用/home/test.log文件的进程
fuser -k -9 /home/test.log
# 示例2:杀死占用8080端口TCP协议的进程
fuser -k -9 8080/tcp

说明:默认不带信号参数时,fuser会发送SIGTERM(信号15),可让进程正常释放资源后退出,非必要不建议强制用-9(SIGKILL)信号。

方案2:手动提取PID再执行kill(适用于需要二次处理PID的场景)

如果需要先打印、校验PID再执行kill操作,可以用文本处理工具提取fuser返回的PID列表,再传递给kill命令:

单命令直接执行写法

# 示例:提取占用8080/tcp的PID并强制杀死,屏蔽fuser的错误提示
fuser 8080/tcp 2>/dev/null | awk '{for(i=2;i<=NF;i++) print $i}' | xargs kill -9

脚本化可扩展写法

如果要整合进shell脚本做逻辑判断,参考以下示例:

#!/bin/bash
# 定义要查询的目标资源,可替换为文件路径、端口/协议等
TARGET_RESOURCE="3306/tcp"
# 提取PID列表,屏蔽fuser无匹配进程的错误输出
PID_LIST=$(fuser ${TARGET_RESOURCE} 2>/dev/null | awk '{for(i=2;i<=NF;i++) print $i}')

if [ -n "${PID_LIST}" ];then
  echo "匹配到占用${TARGET_RESOURCE}的进程:${PID_LIST}"
  # 可根据需求替换为kill -15正常终止
  kill -9 ${PID_LIST}
  echo "进程已杀死"
else
  echo "未找到占用${TARGET_RESOURCE}的进程"
fi

注意事项

  • fuser查询端口时必须指定协议(tcp/udp),否则无法匹配到对应进程
  • 执行kill操作需要对应进程的权限,普通用户无法杀死root启动的进程
  • 无特殊需求优先使用kill -15而非kill -9,避免进程资源未正常释放引发异常

内容的提问来源于stack exchange,提问作者Codeme

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 21:42:00