<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>