在使用jenkins的时候,我们可能有这样的需求,希望jenkins启动的进程在后台持续运行,不阻塞jenkins的构建。1.136版本之前的jenkins不满足这种需求,1.136之后的版本支持。
为什么jenkins的进程是阻塞的?
jenkins主进程和它所启动的子进程通过stdin、stdout、stderr这三个管道相互联系。也因为这样,jenkins可以打印所有进程的日志。子进程可能打印海量的日志,然后结束,但是jenkins主进程要保证所有的子进程通道关闭后,才能认为本次build结束。jenkins只有等到了EOF,才会结束。
一个进程结束后(无论什么原因),操作系统就会关闭这个进程相关的文件描述符。所以即使进程没有关闭stdin、stderr,jenkins也会收到EOF。
主进程开启子进程,子进程会继承主进程所有的文件描述符,包括stdin、stderr通道。如果子进程需要持续运行(守护进程)。一旦主进程忘记关闭子进程,那么jenkins即使在主进程结束后,也不会收到EOF,因为子进程还保留着所有的文件描述符。
一个正常的守护进程会关闭它所有的文件描述符,来避免上述情况。但是有时候,我们就是希望jenkins开启子进程持续运行。
解决办法
UNIX
unix中使用daemonize
命令,如果机器上没有此命令,可以安装下http://software.clapper.org/daemonize/。
daemonize -E BUILD_ID=dontKillMe -o some.log -c /home/User/victor /home/User/victor/test.sh
-o :指定日志文件,-c :命令执行前切换到该路径,最后是要执行脚本的绝对路径。
windows
windows中可以使用at和SCHTASKS命令来实现后台运行。
如果jenkins使用的是ant构建,增加下面的代码即可(执行bat脚本):
<scriptdef name="get-next-minute" language="beanshell">
<attribute name="property" />
date = new java.text.SimpleDateFormat("HH:mm").format(new Date(System.currentTimeMillis() + 60000));
project.setProperty(attributes.get("property"), date);
</scriptdef>
<get-next-minute property="next-minute" />
<exec executable="at">
<arg value="${next-minute}" />
<arg value="/interactive" />
<arg value="${jboss.home}\bin\run.bat" />
</exec>
使用ant构建,执行js脚本:
<exec executable="cscript.exe">
<env key="ANTRUN_TITLE" value="Title for Window" /> <!-- optional -->
<env key="ANTRUN_OUTPUT" value="output.log" /> <!-- optional -->
<arg value="//NoLogo" />
<arg value="antRunAsync.js" /> <!-- this script -->
<arg value="real executable" />
</exec>
使用SCHTASKS命令:
C:\>SCHTASKS /Create /RU SYSTEM /SC ONSTART /TN Tomcat /TR "C:\Program Files\Apache Software Foundation\Tomcat 6.0\bin\startup.bat"
如果是用ant调用,可以使用下面代码:
<exec executable="SCHTASKS">
<arg value="/Run"/>
<arg value="/TN"/>
<arg value="Tomcat"/>
</exec>
版权声明
本站文章、图片、视频等(除转载外),均采用知识共享署名 4.0 国际许可协议(CC BY-NC-SA 4.0),转载请注明出处、非商业性使用、并且以相同协议共享。
© 空空博客,本文链接:https://www.yeetrack.com/?p=969
近期评论