【问题标题】:Clean way of launching a shell script in background from Jenkins从 Jenkins 在后台启动 shell 脚本的干净方式
【发布时间】:2016-05-11 10:49:38
【问题描述】:

从詹金斯启动脚本的正确方法是什么,不要让构建挂起,让进程继续运行?我似乎无法让它工作。脚本未运行或构建挂起。

如果我放入构建的“执行 shell”步骤 bash relaunch.sh &relaunch.sh > output.log &nohup bash relaunch.sh &, 没发生什么事;构建完成,但该过程不运行。我猜这可能与Jenkins等待error pipe to close有关。

如果我这样做 nohup bash relaunch.sh 2>&1 > output.log 建议 here,输出已正确重定向,但构建挂起(未完成),当我终止构建时进程终止。

按照建议的hereherehere,将export BUILD_ID=dontKillMe 添加到“执行shell”步骤或脚本本身也无济于事。当我终止构建时,构建挂起并且进程终止。不用说,我对linux的了解非常有限。

人们如何以干净的方式做到这一点?

【问题讨论】:

  • 我正在提名重新开放,这个问题的答案是正确的,副本没有正确的信息

标签: linux bash shell jenkins


【解决方案1】:

实现此目的的一种便捷方法是更改​​Jenkins's ProcessTreeKiller 正在寻找的Execute shell 下的环境变量BUILD_ID

通过做,

BUILD_ID=dontKillMe nohup bash relaunch.sh &

Jenkins 将假定后台作业不是由构建产生的,并且在完成作业后不会杀死它们。

感谢Joshua 的观察,您也可以将JENKINS_NODE_COOKIE 用作

JENKINS_NODE_COOKIE=dontKillMe

【讨论】:

  • 谢谢,今天这对我们帮助很大!
  • 如果这不起作用,请尝试设置JENKINS_NODE_COOKIE=dontKillMe - devops.stackexchange.com/questions/1473/…
  • 仅供参考,您想将JENKINS_NODE_COOKIE=dontKillMe 用于管道项目,因为BUILD_ID=dontKillMe 在那里不起作用。来源:wiki.jenkins.io/display/JENKINS/ProcessTreeKiller
  • nohup 似乎没有像我预期的那样输出一个名为 nohup.out 的文件。我需要在 & 之前包含 >scan.log 2>&1,以便稍后在管道中实际检查此脚本的输出(或通过浏览工作区中的文件手动检查。)
【解决方案2】:

我遇到了完全相同的问题。 我最终通过在 Jenkins 执行 shell 框中放置以下内容来解决此问题:

BUILD_ID=dontKillMe ./grid.sh

我在脚本文件中移动了&。脚本如下所示:

#!/bin/bash
java -jar selenium-server-standalone-3.0.1.jar -role hub &

希望这对某人有所帮助!

【讨论】:

    【解决方案3】:

    有趣的解决方案。有人试过屏幕吗?

    我是这样运行它的(使用 ModelSim-ASE 进行 RTL 仿真):

    screen -S $testname -d -m -L bash -c 'cd build_sim ; make; make sim'
    echo Waiting for simulator ...
    

    然后我通过查看屏幕日志来等待我们的模拟器进入等待状态。0

    until ((`fgrep -c 'Ready for simulation' screenlog.0`)) ;do
        sleep 1
    done
    

    然后,当其他需要模拟的作业完成运行(或 Jenkins 检测到故障)时,在 post 中运行:

    screen -S $testname -X kill
    

    唯一需要注意的是,如果 Jenkins 在工作清理之前不知何故死了,理论上你可以让模拟器在等待某些事情发生的同时咀嚼资源。

    稍微分解一下:对于屏幕,'-S' 为会话分配一个标题(或使用该标题处理正在运行的会话),'-d' 分离运行,'-m' 首先产生一个 fork(它隐藏在 Jenkins 的注视下),并且 -L 打开日志记录(如果模拟器中的某些东西坏了,这也很方便 - 你现在有一个带有输出的日志文件工件)。其余的只是在屏幕会话中进行 bash。

    【讨论】:

      【解决方案4】:

      我通过执行解决了类似的问题:

      mycommand -parameters &> /dev/null &
      

      不知何故,Jenkins 被附加到我脚本的标准输出中。

      所以我尝试使用&> /dev/null 将标准输出/错误重定向到/dev/null,然后使用& 将进程添加到后台并解决了问题,Jenkins 结束了构建而不杀死产生的进程。

      PD:我尝试在脚本末尾添加exit 0,它被执行了,但这并没有释放 Jenkins 构建,它一直附加到子进程输出。

      【讨论】:

        猜你喜欢
        • 2011-03-08
        • 2011-11-26
        • 2019-03-16
        • 1970-01-01
        • 1970-01-01
        • 2013-01-08
        • 2023-03-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多