2016-06-14 138 views
1

我想從Jenkins構建作業產生一個web服務器,雖然作業成功,但我遇到了Jenkins在作業退出時自動殺死後臺作業的問題。無法從jenkins作業產生守護進程服務器

+ caddy -port 26748 & 
Activating privacy features... done. 
:26748 
Process leaked file descriptors. See http://wiki.jenkins-ci.org/display/JENKINS/Spawning+processes+from+build for more information 
Finished: SUCCESS 

我讀了詹金斯文檔中關於spawning processes from build,並且還對ProcessTreeKiller,它告訴我,我應該能夠通過daemonizing過程和BUILD_ID環境變量設置爲別的東西來實現這一點,所以我想這:

BUILD_ID=dontKillMe daemon --env="BUILD_ID=dontKillMe" --name="my-process" -- caddy -root `pwd` -port 26748 

然而,儘管我不再得到Process leaked file descriptors消息,這似乎仍然被殺死在退出的過程。儘管我試圖直接在框上運行與Jenkins用戶完全相同的命令,但它工作正常。

有誰知道我在做什麼錯?在工作結束後如何才能讓這個過程繼續下去?

回答

1

我的問題是BUILD_ID需要專門爲daemon進程設置,而不是它的子進程。出於某種原因,BUILD_ID=dontkillme daemon沒有這樣做有效。

我解決了這個用通過對bash會議通過的新BUILD_ID一個bash會話中運行daemon命令:

BUILD_ID=dontKillMe bash -c "daemon --name="my-process" --command 'caddy -root `pwd` -port 26748'" 

這現在已經成功地離開我的守護進程運行。

0

有一個技巧,你可以做,但它有點麻煩,但有效。

你可以做的是通過ssh連接執行bash腳本並將其發送到後臺,同時將進程的pid保存在某處,以便進一步進行檢查。

該命令的格式將是:

ssh -n _hostname_ "_commands_ & echo \$! > \"_path_to_pid_file_\"" & 

實施例與一個永無止境程序:

ssh -n mycomputer.mydomain.com "tail -f /var/log/my.log & echo \$! > \"$WORKSPACE/pid\"" & 

這個例子將產生尾過程監聽永遠爲在/ var新的變化/log/my.log文件並將其pid存儲在$ WORKSPACE/pid文件中。

當從Jenkins作業執行時,一旦作業完成,Jenkins將終止ssh進程,而發送到後臺的命令將繼續在指定主機中執行。

我這樣做通常用於檢查和產卵源代碼在源代碼控制下(通常是git)的進程。

希望這會有所幫助!