Jenkins杀死所有子进程

17

我有一个运行bash脚本的Jenkins任务。

在bash脚本中,我执行了两个操作,类似于:


```bash #!/bin/bash echo "Action 1" echo "Action 2" ```

其中 "Action 1" 和 "Action 2" 是根据您的实际需求替换为实际操作的名称。

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

但是如果任务被手动中止,ApplicationA 仍然在运行(可以通过节点机器上的 ps -ef 查看)。我不能使用陷阱等方式,因为如果 Jenkins 发送一个 9 信号,这种方式就不起作用了(对于 9,陷阱无效)。

如果可以配置此任务以简单地终止它生成的 所有 进程,那将是理想的。请问我该如何做到这一点?


工作在一定时间后被中止,这样可以吗? - Technext
@Technext 不,和用户取消一样。 - fommil
如果我没记错的话,当用户取消一个任务时,它只会被中止。 - Technext
那是什么意思?我需要一些可以处理超时和中止的东西(甚至可能是当我忘记杀死一个子进程时)。 - fommil
请查看此链接 - Technext
我觉得你误解了我的问题。 - fommil
1个回答

19

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

上面的链接说明了如何禁用该功能。您确定您并没有错误地禁用它吗?

编辑:
根据有关禁用 ProcessTreeKiller 的信息,可以通过将环境变量 BUILD_ID 设置为Jenkins作业的构建ID来实现相反的效果。这样,当 ProcessTreeKiller 查找正在运行的进程以进行终止时,也会找到此进程。

export BUILD_ID=$BUILD_ID

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


我刚刚检查了我们的实例,它绝对没有禁用属性设置。我不确定构建结果触发器是否有帮助,因为之后清理很麻烦。我真的需要Jenkins按照“ProcessTreeKiller”所说的去做。也许我需要设置一些环境变量或其他东西。 - fommil
我查看了http://serverfault.com/questions/66363中的子进程环境变量,但是似乎没有设置BUILD_ID。:-/ 看起来&会丢失它,所以我认为问题在于让&继承环境变量。 - fommil
1
我正在尝试在第一行中使用export BUILD_ID=$BUILD_ID来看是否能够解决这个问题。 - fommil
太好了!成功了。我会回答自己的问题,除非你也这么做了(因为你的链接已经指向了答案)。 - fommil
我正在使用Jenkins 2.7.4,println(hudson.util.ProcessTree.enabled)被设置为true。但是当我中止Jenkins作业时,我的子进程仍然没有消失。 - Ankur Agarwal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接