DevOps課程-Configuration Management with Ansible 12(補充)

針對command與shell等module運行nodejs或jar這類運行方式補充

ZONGRU Li
Apr 4, 2022

如同學到筆記12篇內容疑慮卡關

在運行commandshell module要執行已經完成搬運的nodejs的檔案

執行運行node server要跳過檢核,所以加入asyncpoll的設置

但是poll>0是循環檢視該process是否完成,此時async是最大timeout

但是poll=0不檢視,但是此時async的意義官方文件基本略過不說明

後來發現poll=0async幾乎是該process可運行時間

時間一到即kill process的概念

由各種實驗下可以了解到Ansible

commandshell module使用async & poll=0特性:

  • poll=0可以不檢核直接跳向下一步Ansible task
  • 但是可能為了保證process正確結束
  • 所以Ansible會對該process掌控並在async的設置時間(秒)執行kill
  • 所以要運行nodejs或是java -jar這類任務
  • 可能要多包一層sh檔或是如下展示:

1.首先有問題的狀況:

被async控制30秒後process消失

2.加入nohup &設置的狀況:

其他不變
還是一樣30秒消失

後來經提醒使用ps -ef來查看:

上圖紅框處是parent process id

當不是1的時候代表不是init(也就是systemd)起的

此時的運作是:

ansible(主控機) => (操作目標機)python os.system() => nodejs

其中ansible會透過async的設置的數字(秒)來killnodejsprocess

(應該也是透過python os.system()這一層去kill)

3.(解法)包裹為sh檔或是sh -c,i.e.多一層process:

此時執行的話是:

ansible(主控機) => (操作目標機)python os.system() => sh => nodejs

其中sh部分應該也可以改成sh檔方式,跟上面透過sh -c包裹一樣意義

運行起來看到:

運行超過兩分鐘了!

其中第三欄的"1"代表parentprocess idsystemd起的

最終Ansible透過(操作目標機)python os.system()

應該還是有kill掉"sh"的執行

但是其實sh部分是已經執行完消失了,但是sh啟動的nodejs則還會活著!

後來有看到活了9分鐘都還在:

但是之後上這個課變成需要手動去做kill,或另外寫sh判斷做kill的工作!

#參考kill語法:
kill $(ps aux | grep 'node server'|grep -v 'grep' | awk '{print $2}')

一定要記得!!!

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

2022/11/17 開源部分個人筆記給LINE "Java程式語言討論區"社群,希望能對社群的技術學習做一點點貢獻.(掩面....記得退訂閱!

No responses yet