如何在不重启服务器的情况下停止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来完成这个任务。 插件安装后
- 去pipe理jenkins>监督哈德逊/jenkins大师
- 展开线程的细节,右侧的小蓝链接
-
search挂起的作业名称
线程的名字将会像这样开始
Executor #2 for master : executing <your-job-name> #<build-number>
-
点击您想要的工作所在行表格右侧的红色圆形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更新),则无法中止。
我想现在回答太晚了,但是我帮助了一些人。
- 安装监控插件。 ( http://wiki.jenkins-ci.org/display/JENKINS/Monitoring )
- 去jenkinsUrl / monitoring / nodes
- 转到底部的主题部分
- 点击主人左边的详情button
- 按用户时间(ms)sorting
- 然后看看线程的名称,你将得到构build的名称和编号
- 杀了它
我没有足够的声望发布图片抱歉。
希望它可以帮助
如果您拥有无法阻止的pipe道作业,请尝试以下操作:
- 单击构build进度栏旁边的红色X来中止作业
- 点击构build上的“暂停/恢复”以暂停
- 再次点击“暂停/恢复”恢复构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到在同一个帐户下运行该服务的计算机。
您可以复制作业并删除旧作业。 如果没关系,你丢失了旧版本的日志。