【问题标题】:Jenkins kill all child processes詹金斯杀死所有子进程
【发布时间】:2014-08-21 00:55:37
【问题描述】:

我有一个运行 bash 脚本的 jenkins 作业。

在 bash 脚本中,我有效地执行了两个操作,例如

java ApplicationA &
PID_A=$!
java ApplicationB
kill $PID_A   

但如果作业被手动中止,ApplicationA 仍然存在(可以在节点机器上看到ps -ef)。我不能使用陷印等,因为如果 jenkins 发送 9 信号(陷印不适用于9),这将不起作用。

如果可以将此作业配置为简单地杀死它产生的所有进程,那将是理想的,我该怎么做?

【问题讨论】:

  • 工作在一定时间后中止可以吗?
  • @Technext no,与用户取消相同。
  • 如果我没记错的话,当用户取消作业时,它只会中止。
  • 这是什么意思?我需要一些适用于超时和中止的东西(甚至可能我只是忘记杀死一个孩子)
  • 检查this链接。

标签: jenkins


【解决方案1】:

实际上,默认情况下,Jenkins 有一个名为 ProcessTreeKiller 的功能,它负责确保在作业执行后有没有个进程在运行。

上面的链接说明了如何禁用该功能。您确定您没有以某种方式错误地禁用了该功能吗?

编辑:
按照作者的cmets,根据关于禁用ProcessTreeKiller的信息,要实现逆向必须将环境变量BUILD_ID设置为Jenkins作业的build id。这样,当ProcessTreeKiller查看正在运行的进程以杀死时,它也会找到它

export BUILD_ID=$BUILD_ID

您还可以使用 Build Result Trigger 插件,配置第二个作业来清理您的应用程序,并将其配置为监视第一个作业的 ABORTED 状态作为触发器。

【讨论】:

  • 我刚刚检查了我们的实例,它肯定没有设置禁用属性。我不确定构建结果触发器是否会有所帮助,因为事后清理很麻烦。我真的需要詹金斯按照ProcessTreeKiller 所说的那样做。也许我需要设置一些环境变量或其他东西。
  • 我使用serverfault.com/questions/66363 查看了孩子的环境,BUILD_ID 似乎没有设置。 :-/ 看起来 & 失去了那个,所以我相信问题会崩溃到让 & 继承环境。
  • 我在第一行尝试export BUILD_ID=$BUILD_ID,看看它是否修复了它。
  • 耶!那行得通。除非你回答,否则我会回答我自己的问题(因为你的链接将我指向答案)
  • 我在 Jenkins 2.7.4 上,println(hudson.util.ProcessTree.enabled) 设置为 true。当我中止 Jenkins 工作时,我的子进程仍然没有消失。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-08
  • 2013-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多