如何在不重启服务器的情况下停止Jenkins上不可阻挡的僵尸工作?

我们的Jenkins服务器有一个已经运行了三天的工作,但是没有做任何事情。 点击angular落里的小X,什么都不做,控制台输出日志也不显示任何东西。 我已经检查过我们的构build服务器,这个工作实际上并没有运行。

有没有办法告诉jenkins工作是“完成”,编辑一些文件或锁或什么的? 由于我们有很多的工作,我们并不想重启服务器。

转到“pipe理jenkins”>“脚本控制台”在您的服务器上运行脚本来中断挂起的线程。

您可以使用Thread.getAllStackTraces()获取所有活动的线程,并中断挂起的线程。

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

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

转到“pipe理jenkins”>“脚本控制台”并运行脚本:

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

您将只需指定您的JobName和JobNumber。

我使用Monitoring Plugin来完成这个任务。 插件安装后

  1. 去pipe理jenkins>监督哈德逊/jenkins大师
  2. 展开线程的细节,右侧的小蓝链接
  3. search挂起的作业名称

    线程的名字将会像这样开始

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

  4. 点击您想要的工作所在行表格右侧的红色圆形button

一旦遇到无法通过“脚本控制台”停止的构build, 最后我用这些步骤解决了这个问题:

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

生成超时插件可以派上用场。 如果时间太长,它会自动终止作业。

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

编辑:

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

  • 如果jenkins被困在无限循环中,它永远不会被中止。
  • 如果Jenkins正在Java VM中执行networking或文件I / O(例如冗长的文件副本或SVN更新),则无法中止。

我想现在回答太晚了,但是我帮助了一些人。

  1. 安装监控插件。 ( http://wiki.jenkins-ci.org/display/JENKINS/Monitoring
  2. 去jenkinsUrl / monitoring / nodes
  3. 转到底部的主题部分
  4. 点击主人左边的详情button
  5. 按用户时间(ms)sorting
  6. 然后看看线程的名称,你将得到构build的名称和编号
  7. 杀了它

我没有足够的声望发布图片抱歉。

希望它可以帮助

如果您拥有无法阻止的pipe道作业,请尝试以下操作:

  1. 单击构build进度栏旁边的红色X来中止作业
  2. 点击构build上的“暂停/恢复”以暂停
  3. 再次点击“暂停/恢复”恢复构build

暂停/恢复管道作业

jenkins会意识到工作应该终止,并停止构build

在这种情况下,我通常使用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的构build。 一般的帮助可以通过运行

 java -jar jenkins-cli.jar help 

使用上下文命令帮助delete-builds

 java -jar jenkins-cli.jar delete-builds 

第一个build议的解决scheme非常接近。 如果使用stop()而不是interrupt(),它甚至会杀死失控的线程,这些线程在groovy系统脚本中无处不在。 这将杀死任何构build,运行的工作。 这里是代码:

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

亚历山德鲁·class蒂克的回答对我来说很有效,但我的执行人员仍然显得很忙。 我可以使用以下方式清除忙碌的执行者身份

 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() } } } } 

现在有两次同样的问题发生在我身上,唯一的修复沙发就是重启tomcat服务器并重启生成。

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

您可以复制作业并删除旧作业。 如果没关系,你丢失了旧版本的日志。