如何查找Jenkin主从节点中运行超5小时的任务并终止
Jenkins超时运行任务查询与终止方案
直接执行脚本处理(临时一次性清理)
直接在Jenkins主节点的「管理Jenkins」-「脚本控制台」运行如下Groovy脚本即可,自动覆盖主节点和所有客户端(Agent)节点上的运行任务:
import jenkins.model.Jenkins // 超时阈值:5小时,单位为毫秒 def timeoutMs = 5 * 60 * 60 * 1000 def currentTime = System.currentTimeMillis() Jenkins.get().getAllItems(hudson.model.Job.class).each { job -> job.getBuilds().each { build -> if (build.isBuilding()) { def duration = currentTime - build.getStartTimeInMillis() if (duration > timeoutMs) { println "待终止任务:${job.fullName} 构建编号${build.number},已运行${String.format("%.1f", duration/3600000)}小时" // 安全终止构建,同步停止Agent端的对应进程 build.doStop() } } } } println "超时任务处理完成"
注意:运行脚本的账号需持有Jenkins管理员权限和任务终止权限。
配置长期自动超时规则
如果需要避免后续再出现长时间运行的冗余任务,可以直接在任务配置中加超时规则,无需每次手动执行脚本:
- 自由风格任务:进入任务配置页,找到「构建环境」板块,勾选「如果构建花费时间太长,则中止构建」,设置超时时间为5小时即可
- 流水线任务:直接在Jenkinsfile中添加全局超时配置,示例如下:
pipeline { agent any options { timeout(time: 5, unit: 'HOURS') } stages { stage('业务构建') { steps { // 此处填写原流水线业务逻辑 } } } }
原方案失效原因说明
你之前调用
Thread.getAllStackTraces()无法达到预期效果,是因为Jenkins的Agent节点任务运行在独立于主节点的进程中,不归主节点JVM的线程池管理;就算是主节点本地的构建任务,也大多运行在独立的工作进程中,直接枚举JVM线程既无法匹配到对应构建任务,也可能误操作核心线程引发主服务崩溃,不推荐使用该方式处理构建任务。
内容的提问来源于stack exchange,提问作者Nilan
相关产品推荐
相关产品推荐

