在Jenkins的使用中,遇到過的一個場景是:在web代碼更改之后,能自動的部署到測試服務器,我們寫了run.sh腳本來重啟服務,在使用Jenkins的任務自動跑這個腳本后發現,服務沒有起來。開始以為是run.sh腳本的問題,但是直接執行是沒有問題的;之后一直查運行環境差異,發現也不是這個原因;到后來才懷疑到Jenkins任務結束時候自動關掉了所有的子進程。通過以下shell腳本片段解決了問題:
#臨時改變BUILD_ID值,使得Jenkins不會找到並結束掉run.sh啟動的后台進程
OLD_BUILD_ID=$BUILD_ID
echo $OLD_BUILD_ID
BUILD_ID=dontKillMe
./run.sh restart
#改回原來的BUILD_ID值
BUILD_ID=$OLD_BUILD_ID
echo $BUILD_ID
問題的根本在於是Jenkins使用processTreeKiller殺掉了所有子進程,而且這是Jenkins的默認行為。其實回頭來看這個問題,就發現Jenkins的做法非常合理。當一次build異常結束,或被人終止時,必然需要結束所有這次build啟動的子進程。下面的link提供了更多細節,以及解決方法。https://wiki.jenkins-ci.org/display/JENKINS/ProcessTreeKiller