如何在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
相关产品推荐
相关产品推荐

