如何在不重新启动服务器的情况下阻止Jenkins无法阻挡的僵尸工作?

时间:2013-01-22 10:37:50

标签: jenkins

我们的Jenkins服务器的作业已经运行了三天,但没有做任何事情。单击角落中的小X不会执行任何操作,控制台输出日志也不会显示任何内容。我已经检查了我们的构建服务器,并且该作业实际上似乎根本没有运行。

有没有办法通过编辑某个文件或锁定或某事来告诉詹金斯这项工作是“完成”的?由于我们有很多工作,我们真的不想重启服务器。

27 个答案:

答案 0 :(得分:215)

我也有同样的问题,并通过Jenkins控制台修复它。

转到“管理Jenkins”> “脚本控制台”并运行脚本:

 Jenkins .instance.getItemByFullName("JobName")
        .getBuildByNumber(JobNumber)
        .finish(hudson.model.Result.ABORTED, new java.io.IOException("Aborting build")); 

您只需指定您的JobName和JobNumber即可。

答案 1 :(得分:143)

转到"管理Jenkins" > "脚本控制台"在服务器上运行脚本以中断挂起的线程。

您可以使用Thread.getAllStackTraces()获取所有实时主题,并中断挂起的主题。

Thread.getAllStackTraces().keySet().each() {
  t -> if (t.getName()=="YOUR THREAD NAME" ) {   t.interrupt();  }
}

更新:

使用线程的上述解决方案可能无法在更新的Jenkins版本上运行。要中断冻结管道,请参阅this解决方案(alexandru-bantiuc),然后运行:

Jenkins.instance.getItemByFullName("JobName")
                .getBuildByNumber(JobNumber)
                .finish(
                        hudson.model.Result.ABORTED,
                        new java.io.IOException("Aborting build")
                );

答案 2 :(得分:22)

我使用the Monitoring Plugin执行此任务。安装插件后

  1. 转到管理Jenkins>监督哈德森/詹金斯大师
  2. 展开“主题细节”,右侧的小蓝色链接
  3. 搜索挂起的作业名称

    线程的名称将像这样开始

    Executor #2 for master : executing <your-job-name> #<build-number>

  4. 点击所需作业所在行表格右侧的红色圆形按钮

答案 3 :(得分:21)

一旦我遇到了“脚本控制台”无法阻止的构建。最后,我通过以下步骤解决了问题:

ssh onto the jenkins server
cd to .jenkins/jobs/<job-name>/builds/
rm -rf <build-number>
restart jenkins

答案 4 :(得分:18)

第一个提出的解决方案非常接近。如果使用stop()而不是interrupt(),它甚至会杀死失控的线程,这些线程在一个时髦的系统脚本中无休止地运行。这会杀死任何为作业运行的构建。 这是代码:

Thread.getAllStackTraces().keySet().each() {
    if (it.name.contains('YOUR JOBNAME')) {  
      println "Stopping $it.name"
      it.stop()
    }
}

答案 5 :(得分:17)

如果您有Multibranch Pipeline - 工作(并且您是Jenkins-admin),请使用Jenkins Script Console此脚本:

Jenkins.instance
.getItemByFullName("<JOB NAME>")
.getBranch("<BRANCH NAME>")
.getBuildByNumber(<BUILD NUMBER>)
.finish(hudson.model.Result.ABORTED, new java.io.IOException("Aborting build"));

来自https://issues.jenkins-ci.org/browse/JENKINS-43020

答案 6 :(得分:11)

如果您有不可阻挡的管道作业,请尝试以下操作:

  1. 点击构建进度条旁边的红色X
  2. 中止作业
  3. 点击构建上的“暂停/恢复”暂停
  4. 再次点击“暂停/恢复”以恢复构建
  5. Pause/Resume pipeline job

    Jenkins将意识到应该终止这项工作并停止构建

答案 7 :(得分:7)

对于此类案件,

Build-timeout Plugin可以派上用场。如果花费太长时间,它将自动终止作业。

答案 8 :(得分:6)

我想回答为时已晚,但我帮助了一些人。

  1. 安装监控插件。 (http://wiki.jenkins-ci.org/display/JENKINS/Monitoring
  2. 转到jenkinsUrl / monitoring / nodes
  3. 转到底部的“主题”部分
  4. 点击主人
  5. 左侧的详细信息按钮
  6. 按用户时间(毫秒)排序
  7. 然后查看线程的名称,您将获得构建的名称和编号
  8. 杀了它
  9. 我没有足够的声誉发布图片抱歉。

    希望它可以提供帮助

答案 9 :(得分:6)

top answer几乎对我有用,但我遇到了一个主要问题:由于Jenkins重新启动的时机特别糟糕,我有一个非常大的(~100)僵尸作业,因此手动查找作业名称并建立每个僵尸工作的数量,然后手动杀死它们是不可行的。以下是我如何自动找到并杀死僵尸的工作:

Jenkins.instance.getItemByFullName(multibranchPipelineProjectName).getItems().each { repository->
  repository.getItems().each { branch->
    branch.builds.each { build->
      if (build.getResult().equals(null)) {
        build.doKill()
      }
    }
  }
}

此脚本循环遍历所有作业的所有版本,并使用getResult().equals(null)来确定作业是否已完成。队列中但尚未启动的构建将不会被迭代(因为该构建不会在job.builds中),并且已经完成的构建将返回某些内容null以外的build.getResult()除外。合法运行的作业也将具有null的构建结果,因此请确保在运行此作业之前没有您想要杀死的正在运行的作业。

多个嵌套循环主要用于发现Multibranch Pipeline项目中每个存储库的每个分支/ PR;如果您不使用Multibranch Pipelines,您可以使用Jenkins.instance.getItems().each之类的内容直接遍历所有作业。

答案 10 :(得分:5)

无需使用脚本控制台或其他插件,只需在浏览器中的构建URL后面输入/stop/term/kill即可abort a build

从上面的链接中逐字引用:

可以通过向构建的URL端点发送HTTP POST请求来停止管道作业。

  • 内置ID URL /停止-终止管道。
  • BUILD ID URL / term-强制终止构建(仅应在stop不起作用时使用。
  • BUILD ID URL / kill-强制终止管道。这是停止管道的最具破坏性的方法,应仅用作最后的手段。

答案 11 :(得分:5)

我看过Jenkins的来源,看来我正在尝试做的事情是不可能的,因为停止工作似乎是通过线程中断来完成的。我不知道为什么这个工作挂了..

编辑:

不可阻挡的工作的可能原因:

  • 如果Jenkins陷入无限循环,它永远不会被中止。
  • 如果Jenkins在Java VM中进行网络或文件I / O(例如冗长的文件复制或SVN更新),则无法中止。

答案 12 :(得分:3)

在这种情况下,我通常使用jenkins-cli。您可以从页面http://your-jenkins-host:PORT/cli下载jar。然后运行

java -jar jenkins-cli.jar delete-builds name_of_job_to_delete hanging_job_number

辅助信息:

您也可以传递一系列版本,例如350:400。 运行

提供常规帮助
java -jar jenkins-cli.jar help

delete-builds的上下文命令帮助
java -jar jenkins-cli.jar delete-builds

答案 13 :(得分:2)

亚历山德鲁·班蒂克的回答对我来说很有效,但我的遗嘱执行人仍然表现得很忙。我可以使用以下

清除繁忙的执行程序状态
server_name_pattern = /your-servers-[1-5]/
jenkins.model.Jenkins.instance.getComputers().each { computer ->
  if (computer.getName().find(server_name_pattern)) {
    println computer.getName()
    execList = computer.getExecutors()      
    for( exec in execList ) {
      busyState = exec.isBusy() ? ' busy' : ' idle'
      println '--' + exec.getDisplayName() + busyState
      if (exec.isBusy()) {
        exec.interrupt()
      }
    }
  }
}

答案 14 :(得分:2)

最近,我遇到了一个节点/代理,该节点/代理有一个执行程序连续数天被管道作业的构建“ X”占用,尽管该作业页面声称构建“ X”已不存在(在10个后续构建之后被丢弃(! ),如在管道作业中配置的)。验证在磁盘上:构建“ X”确实消失了。

解决方案:是代理程序/节点错误地报告了占用的执行程序正在忙于运行构建“ X”。中断执行程序的线程已立即释放它。

def executor = Jenkins.instance.getNode('NODENAME').computer.executors.find {
    it.isBusy() && it.name.contains('JOBNAME')
}

println executor?.name
if (executor?.isBusy()) executor.interrupt()

考虑的其他答案:

  • @cheffe的答案无效(请参阅下一点,并在下面进行更新)。
  • Thread.getAllStackTraces()的答案:没有匹配的线程。
  • @levente-holló的答案以及所有getBuildByNumber()的答案:均不适用,因为该构建不再存在!
  • @austinfromboston的回答:接近我的需求,但它同时也不利于目前正在运行的任何其他构建。

更新
我再次遇到了类似的情况,一个执行器被(仍然存在的)已完成的管道构建占用了数天。该代码段是唯一可行的解​​决方案。

答案 15 :(得分:1)

有同样的问题,但没有堆栈线程。我们在Jenkins控制台中使用此代码段删除了该作业。用你的替换jobname和buil dnumber。

def jobname = "Main/FolderName/BuildDefinition"
def buildnum = 6
Jenkins.instance.getItemByFullName(jobname).getBuildByNumber(buildnum).delete(); 

答案 16 :(得分:1)

我有很多僵尸工作,所以我使用了以下脚本:

for(int x = 1000; x < 1813; x = x + 1) {
    Jenkins .instance.getItemByFullName("JOBNAME/BRANCH")
    .getBuildByNumber(x)
    .finish(hudson.model.Result.ABORTED, new java.io.IOException("Aborting build"))
}

答案 17 :(得分:1)

我在过去半小时遇到了同样的问题...

无法删除在我的多分支管道中运行的僵尸版本。 甚至服务器也可以通过UI重启,甚至可以通过sudo service jenkins restart从命令行重启 确实阻止了执行...构建是不可停止的...它总是会重新出现。

  

使用的版本:Jenkins版本2.150.2

我很生气,但是...当查看构建日志时,我发现在日志末尾有一些有趣的东西:

Logfile output of an zombie build and showing restart did not stop it

红色标记的部分是“令人沮丧的部分” ... 如您所见,我一直想从UI中止构建,但没有成功...

但是有一个超文本文本Click here to forcibly terminate running steps ...(第一个绿色的超链接)。 现在我按下链接...) 链接执行后,出现了关于Still paused的消息和另一个链接Click here to forcibily kill entire build(第二绿色) 在按下此链接后,构建也被最终杀死...

因此,这似乎不需要任何特殊的插件(多分支管道构建插件本身除外)也可以工作。

答案 18 :(得分:1)

每次都对我有用:

<div class="col-lg-4 col-md-6">
  <article class="review">
    <div class="review__info">
      <strong>John Smith</strong>
      Company Name
    </div>
    <h2 class="review__title">Customer Review Title</h2>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer laoreet laoreet bibendum. Mauris condimentum, ligula eu pulvinar maximus, turpis urna laoreet est, id gravida dolor risus in ex. In mattis sodales varius. Nunc egestas nisl vitae turpis rhoncus, sit amet vulputate mauris hendrerit. Integer et sollicitudin lorem. Vestibulum at tortore turpis rhoncus, sit amet vulputate mauris hendrerit. Integer et sollicitudin lorem. Vestibulum at tortor blandit, pulvinar risus vel, luctus nisl.</p>
    <a href="#" title="Read more" class="review__link">Read More</a>
  </article>
</div>

感谢funql.org

答案 19 :(得分:0)

我写的一个名为jkillthread的实用程序可用于阻止任何Java进程中的任何线程,只要您可以在同一帐户下登录运行该服务的计算机。

答案 20 :(得分:0)

非常简单的解决方案

我看到此问题的原因是页面上的%链接不正确,而不是应该http停止的链接。您需要做的就是按照以下说明编辑html页面中的https属性

  1. 打开挂起的作业(管道)的控制台日志
  2. 单击任何可用的方法终止工作(x图标,“单击此处以强制终止运行的步骤”等),以显示“单击此处以强制终止整个构建”的链接(现在可以点击)
  3. 打开浏览器控制台(使用chrome中的以下三种:F12; Ctrl + shift + i;菜单->更多工具->开发人员工具
  4. 手动或使用控制台的“在页面中选择一个元素”按钮,找到“单击此处以强制杀死整个构建”链接
  5. 双击onclick属性以编辑其值
  6. onclick附加到s以拥有http
  7. 按Enter提交更改
  8. 单击“单击此处以强制杀死整个构建”链接

使用屏幕截图作为参考 enter image description here

答案 21 :(得分:0)

使用https://my-jenkins/script上的脚本控制台

import hudson.model.Job
import org.jenkinsci.plugins.workflow.job.WorkflowRun

Collection<Job> jobs = Jenkins.instance.getItem('My-Folder').getAllJobs()
for (int i = 0; i < jobs.size(); i++) {
  def job = jobs[i]
  for (int j = 0; j < job.builds.size(); j++) {
    WorkflowRun build = job.builds[j]
    if (build.isBuilding()) {
      println("Stopping $job ${build.number}")
      build.setResult(Result.FAILURE)
    }
  }
}

答案 22 :(得分:0)

现在我遇到了同样的问题两次,唯一的修复沙发就是重启tomcat服务器并重新启动构建。

答案 23 :(得分:0)

这些解决方案都不适合我。我必须重新启动安装服务器的计算机。不可杀的工作现在不见了。

答案 24 :(得分:-1)

以下是我使用Blue Ocean

在版本2.100中解决此问题的方法
  • 我安装的唯一插件是bitbucket。
  • 我只有一个节点。

ssh进入我的Jenkins框
cd ~/.jenkins(我保留詹金斯的地方)
cd job/<job_name>/branches/<problem_branch_name>/builds
rm -rf <build_number>

在此之后,您可以选择更改nextBuildNumber中的数字(我这样做了)

最后,我重新启动了jenkins(brew services restart jenkins)这个步骤显然会有所不同,具体取决于你如何管理和安装Jenkins。

答案 25 :(得分:-1)

您只需复制作业并删除旧作业即可。如果丢失旧的构建日志并不重要。

答案 26 :(得分:-2)

进入蓝色海洋用户界面。 尝试从那里停止工作。