<p>在使用jenkins的时候,咱们可能有这样的需求,但愿jenkins启动的进程在后台持续运行,不阻塞jenkins的构建。1.136版本以前的jenkins不知足这种需求,1.136以后的版本支持。</p>java
<h2>为何jenkins的进程是阻塞的?</h2>shell
<p>jenkins主进程和它所启动的子进程经过stdin、stdout、stderr这三个管道相互联系。也由于这样,jenkins能够打印全部进程的日志。子进程可能打印海量的日志,而后结束,可是jenkins主进程要保证全部的子进程通道关闭后,才能认为本次build结束。jenkins只有等到了EOF,才会结束。</p>windows
<p>一个进程结束后(不管什么缘由),操做系统就会关闭这个进程相关的文件描述符。因此即便进程没有关闭stdin、stderr,jenkins也会收到EOF。</p>app
<p>主进程开启子进程,子进程会继承主进程全部的文件描述符,包括stdin、stderr通道。若是子进程须要持续运行(守护进程)。一旦主进程忘记关闭子进程,那么jenkins即便在主进程结束后,也不会收到EOF,由于子进程还保留着全部的文件描述符。</p>ui
<p>一个正常的守护进程会关闭它全部的文件描述符,来避免上述状况。可是有时候,咱们就是但愿jenkins开启子进程持续运行。</p>操作系统
<h2>解决办法</h2>unix
<h3>unix</h3>日志
<p>unix中使用<code>daemonize</code>命令,若是机器上没有此命令,能够安装下<a href="http://software.clapper.org/daemonize/">http://software.clapper.org/daemonize/</a>。</p>code
<pre><code>daemonize -E BUILD_ID=dontKillMe -o some.log -c /home/User/victor /home/User/victor/test.sh </code></pre>orm
<p>-o :指定日志文件,-c :命令执行前切换到该路径,最后是要执行脚本的绝对路径。</p>
<h2>windows</h2>
<p>windows中可使用at和SCHTASKS命令来实现后台运行。<br/> 若是jenkins使用的是ant构建,增长下面的代码便可(执行bat脚本):</p>
<pre><code><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> </code></pre>
<p>使用ant构建,执行js脚本:</p>
<a href="http://www.yeetrack.com/?p=965">继续阅读-></a>