Jenkins啓動守護進程後臺持續運行

<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>&lt;scriptdef name="get-next-minute" language="beanshell"&gt; &lt;attribute name="property" /&gt; date = new java.text.SimpleDateFormat("HH:mm").format(new Date(System.currentTimeMillis() + 60000)); project.setProperty(attributes.get("property"), date); &lt;/scriptdef&gt; &lt;get-next-minute property="next-minute" /&gt; &lt;exec executable="at"&gt; &lt;arg value="${next-minute}" /&gt; &lt;arg value="/interactive" /&gt; &lt;arg value="${jboss.home}\bin\run.bat" /&gt; &lt;/exec&gt; </code></pre>

<p>使用ant構建,執行js腳本:</p>

<a href="http://www.yeetrack.com/?p=965">繼續閱讀-></a>

相關文章
相關標籤/搜索