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

Jenkins执行kill命令终止进程后返回exit-status:-1的问题排查

问题排查与解决方案

问题原因

exit-status:-1的核心原因是进程匹配范围错误,导致终止了执行脚本的自身进程:

  • 使用pgrep -f service-name时,会匹配所有命令行包含service-name的进程,包括执行该命令的bash进程和grep进程(从ps -ef输出可见,执行脚本的bash进程命令行中包含service-name)。
  • 当kill -9批量终止这些PID时,当前执行脚本的bash进程被杀死,导致SSH连接直接中断,Jenkins无法获取正常退出状态,返回异常值-1。

验证依据

从测试脚本输出可确认:

  • pgrep不仅匹配了目标Java进程(如56980),还匹配了执行脚本的bash进程(如57070、57081)。
  • 当kill这些bash进程后,后续命令执行被打断,最终SSH返回exit-status:-1。

正确的进程终止方法

方法1:精准匹配目标进程,排除自身

用精确的命令行匹配,同时排除当前执行的脚本进程:

# 匹配精确的Java启动命令,排除grep和当前bash进程
ps aux | grep "java -jar /root/service-name --spring.config.location=/root/service-name/application.properties" | grep -v grep | grep -v $$ | awk '{print $2}' | xargs kill -9 2>/dev/null

解释:

  • grep -v grep:排除grep自身进程
  • grep -v $$:排除当前执行脚本的bash进程($$代表当前shell的PID)
  • 2>/dev/null:忽略kill可能出现的"无对应进程"错误输出

方法2:使用pgrep的精确匹配与过滤

# 仅匹配目标Java进程,排除当前脚本进程
pgrep -f "^java -jar /root/service-name --spring.config.location=/root/service-name/application.properties$" | grep -v $$ | xargs kill -9 2>/dev/null

解释:

  • ^和$确保完全匹配命令行,避免模糊匹配其他进程
  • grep -v $$排除当前bash进程

方法3:先验证进程存在再执行kill

增加进程存在性检查,避免无意义的kill操作:

TARGET_PID=$(ps aux | grep "java -jar /root/service-name" | grep -v grep | grep -v $$ | awk '{print $2}')
if [ -n "$TARGET_PID" ]; then
  kill -9 $TARGET_PID
  echo "Successfully killed process $TARGET_PID"
else
  echo "No target process found"
fi

额外注意事项

  • 优先使用优雅终止:kill -9会强制终止进程,可能导致数据丢失或资源泄漏,优先尝试默认的kill(发送SIGTERM信号)让进程优雅退出,失败后再使用kill -9。
  • 确保脚本返回正常状态:Jenkins会以脚本最后一个命令的退出状态作为任务状态,若需忽略kill的错误状态,可在命令后添加|| true。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 11:39:35