場景描述
最近在測試環境上搭建了一套jenkins構建集群,然後在這個集群中的某個靜態節點上跑乙個jenkins構建任務,構建任務裡面的工作是這樣的:在靜態節點上編譯構建好該服務,生成可執行檔案,再執行可執行檔案,並期望該靜態節點在構建任務結束後該服務不隨構建任務的結束而停止執行,現在挑重點說明一下,
最後乙個步驟是採用shell經典的做法,使用nohup command &的方式來處理,
但實際情況是當構建任務停止後,靜態節點也跟著停止。在各種嘗試後,仍然沒有按預期的方式執行。
先了解下jenkins構建流程的基本原理:
jenkins官方給出解釋,jenkins每次構建完了後都會自動殺掉在執行過程中啟動的子程序。jenkins使用processtreekiller殺掉了所有子程序,而且這是jenkins的預設行為。當一次build異常結束,或被人終止時,必然需要結束所有這次build啟動的子程序。如果要避免jenkins按照預設的方式處理子程序,官方提供了如下的解決方案:
設定jenkins_node_cookie 引數的值,使用方法如下
在pipeline的job中,執行指令碼的時候,用下面的方法即可
withenv([『jenkins_node_cookie=dontkillme』])
在執行 shell輸入框中加入build_id=dontkillme ,即可防止jenkins殺死啟動的程序
臨時改變build_id值,使得jenkins不會找到並結束掉run.sh啟動的後台程序
樣例如下:
old_build_id=
$build_id
echo
$old_build_id
export build_id=dontkillme
#執行tomcat啟動指令碼
sh $/bin/startup.sh
#改回原來的build_id值
export build_id=
$old_build_id
echo
$build_id
為了驗證,我們給出如下幾個例子
jenkins版本:2.150.1
經驗證,該方法在jenkins 2.***版本中已失效
export jenkins_node_cookie=dontkillme
nihup ./*** &
或者新增groovy指令碼
withenv(['jenkins_node_cookie=dontkillme'])
除了官方給出的方案,還可以通過外掛程式的方式來避免該問題
指令碼如下:
node ; do echo -n \"loop \$i \"; date ; sleep 1; done"
}}
使用外掛程式來完成該操作,可參考
這種方式未嘗試,就是不直接使用sh命令,而是通過pipeline間接呼叫sh,感興趣的同學可以嘗試下
jenkins服務啟動正常但是無法訪問
重新部署了虛擬機器,安裝了jenkins,埠配置都設定好了,然後興沖沖的去訪問 http 8888 本地埠配置的8888 結果打不開,我以為安裝的版本有問題,於是解除安裝重灌,但發現還是同樣的問題,好吧,再來檢查下 檢查服務 檢視埠臥槽!why?難道是防火牆,查下防火牆 先別急著禁用,再檢視下埠是否...
hadoop程序無法正常關閉的問題
hadoop 關閉時nodemanager等程序無法正常關閉 是因為hadoop長時間保持啟動的狀態,在用stop all.sh命令關閉集群時,是根據datanode上的mapred和dfs程序號來執行的,系統每隔一短時間會清空程序號所在的資料夾,所以找不到對應的程序就無法關閉相應的程序。ps ef...
Chrome Adobe Flash 無法正常使用
該 因是是google.com,被強了,所以一般打不開。故將google官方說明記錄以下 如果 adobe flash 無法正常使用,或者您看到以下錯誤訊息,請嘗試按照下文介紹的問題排查步驟操作。如果您使用的是移動裝置,那麼 flash 無法在 chrome 中使用。在計算機上開啟 chrome。在...