从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 &
,输出已正确重定向,但构建会挂起(不会完成),并且当我终止构建时进程会终止。
按照建议的here,here和here将nohup bash relaunch.sh 2>&1 > output.log
添加到"执行shell"步骤或脚本本身也没有帮助。当我杀死构建时,构建挂起并且进程终止。毋庸置疑,我对linux的了解非常有限。
人们如何以干净的方式做到这一点?
答案 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 构建,它一直附加到子进程输出。