从Jenkins开始在后台启动shell脚本的简洁方法

时间:2016-05-11 10:49:39

标签: linux bash shell jenkins

从jenkins启动脚本的正确方法是什么,不要让构建挂起,让流程继续运行?我似乎无法让它发挥作用。脚本无法运行或构建挂起。

如果我加入构建"执行shell"步骤import java.io.IOException; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.security.core.Authentication; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; public class AjaxAuthenticationProcessingFilter extends UsernamePasswordAuthenticationFilter { @Override protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response,FilterChain filter, Authentication authResult) throws IOException, ServletException { super.successfulAuthentication(request, response,filter, authResult); } } bash relaunch.sh &relaunch.sh > output.log &, 什么都没发生;构建完成,但该过程不会运行。我想这可能与Jenkins等待error pipe to close

有关

如果我这样做 根据建议here nohup bash relaunch.sh &,输出已正确重定向,但构建会挂起(不会完成),并且当我终止构建时进程会终止。

按照建议的herehereherenohup bash relaunch.sh 2>&1 > output.log添加到"执行shell"步骤或脚本本身也没有帮助。当我杀死构建时,构建挂起并且进程终止。毋庸置疑,我对linux的了解非常有限。

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

4 个答案:

答案 0 :(得分:23)

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

通过这样做,

BUILD_ID=dontKillMe nohup bash relaunch.sh &

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

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

JENKINS_NODE_COOKIE=dontKillMe

答案 1 :(得分:8)

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

BUILD_ID=dontKillMe ./grid.sh

我在脚本文件中移动了&。这是脚本的样子:

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

希望这有助于某人!

答案 2 :(得分:1)

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

这是我的运行方式(用于使用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检测到故障)时,在帖子中运行:

screen -S $testname -X kill

唯一的警告是,如果詹金斯(Jenkins)在清理工作之前以某种方式死亡,那么从理论上讲,您可以让模拟器在等待某些事情发生时消耗掉资源。

稍微细分一下:在屏幕上,“-S”为会话分配一个标题(或使用该标题寻址正在运行的会话),“-d”分离运行,“-m”首先产生一个叉子(它从Jenkins的监视下隐藏了起来),并且-L打开了日志记录(在模拟器中的某些内容中断的情况下也很方便-现在您的日志文件带有输出)。剩下的只是在屏幕会话中的重击。

答案 3 :(得分:0)

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

mycommand -parameters &> /dev/null &

Jenkins 以某种方式附加到我脚本的标准输出中。

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

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