DevOps課程-Configuration Management with Ansible 12(補充)
如同學到筆記12篇內容疑慮卡關
在運行command或shell module要執行已經完成搬運的nodejs的檔案
執行運行node server要跳過檢核,所以加入async與poll的設置
但是poll>0是循環檢視該process是否完成,此時async是最大timeout
但是poll=0是不檢視,但是此時async的意義官方文件基本略過不說明
後來發現poll=0時async幾乎是該process可運行時間
時間一到即kill process的概念
由各種實驗下可以了解到Ansible的
command或shell module使用async & poll=0特性:
- 當poll=0可以不檢核直接跳向下一步Ansible task
- 但是可能為了保證process正確結束
- 所以Ansible會對該process掌控並在async的設置時間(秒)執行kill
- 所以要運行nodejs或是java -jar這類任務
- 可能要多包一層sh檔或是如下展示:
1.首先有問題的狀況:
2.加入nohup &設置的狀況:
後來經提醒使用ps -ef來查看:
上圖紅框處是parent process id
當不是1的時候代表不是init(也就是systemd)起的
此時的運作是:
ansible(主控機) => (操作目標機)python os.system() => nodejs
其中ansible會透過async的設置的數字(秒)來kill掉nodejs的process
(應該也是透過python os.system()這一層去kill)
3.(解法)包裹為sh檔或是sh -c,i.e.多一層process:
此時執行的話是:
ansible(主控機) => (操作目標機)python os.system() => sh => nodejs
其中sh部分應該也可以改成sh檔方式,跟上面透過sh -c包裹一樣意義
運行起來看到:
其中第三欄的"1"代表parent的process id是systemd起的
最終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}')
一定要記得!!!