ansible學習系列之順利啓動後臺程序

場景

最近在編寫ansible腳本,需要啓動java後臺程序,啓動腳本如下:

cd /data/adapter
java -Dadapter -Xms512M -Xmx12G -classpath  .:./conf:./lib/* StartAdapter >./log/run-adapter.log 2>./log/err-adapter.log &

不使用ansible進行批量啓動的話,只在本地啓動是可以正常啓動的。但是使用ansible執行批量啓動的話,啓動過程未報錯,但是到後臺程序的日誌查看,日誌大小爲空,使用ps -ef|grep Dadapter是找不到對應的程序的。

環境

軟件 版本
Ansible 2.9.4
Python 2.7.5
Centos 7

原因

按照ansible官方的回答,是因爲每個任務都基於SSH運行,並且基於爲該會話創建的終端。父進程完成後,終端關閉,這意味着與該終端關聯的所有其他進程也被殺死了。 這屬於SSH會話的標準做法。這是原文的鏈接地址 issues-33410,有興趣的小夥伴可以打開鏈接進去看看。其實,我覺得可能是ansible的做法有點奇怪,和我們正常的操作有點不同。如果按照官方的回答,我們在平時ssh到服務器,在上面啓動程序之後,退出之後,程序應該也會被關閉。但是,真實情況是沒有出現這種情況。所以,在issues-33410也有人提出了這個問題,不過沒有得到官方的回覆。

嘗試

添加nohup指令

按照官方回答,我在啓動腳本上面,添加了nohup指令,修正後爲以下腳本:

cd /data/adapter
nohup java -Dadapter -Xms512M -Xmx12G -classpath  .:./conf:./lib/* StartAdapter >./log/run-adapter.log 2>./log/err-adapter.log &

在筆者的環境裏面,是部署了3臺機器。在未添加nohup指令的時候,一個程序都沒有正常啓動起來。添加了之後,有2個程序正常啓動,而有一個機器的程序沒有啓動起來

source環境變量

使用ansible遠程執行shell命令的時候,會存在環境變量的加載順序的問題。ansible執行是使用non-login shell,只是會加載/.bashrc/etc/bashrc,而不會加載/etc/profile~/.bash_profile。所以我們使用指定用戶執行的時候,如果有部分軟件的環境變量是設置在/etc/profile~/.bash_profile,那麼就需要顯示地引入纔可以正常啓動。比如,我上一步沒有順利啓動的程序環境,是需要jdk環境,而是單獨設置在~/.bash_profile,所以默認環境變量沒有引入~/.bash_profile,導致啓動失敗。所以加入了環境變量啓動的環節,修正的版本如下:

source ~/.bash_profile
cd /data/adapter
nohup java -Dadapter -Xms512M -Xmx12G -classpath  .:./conf:./lib/* StartAdapter >./log/run-adapter.log 2>./log/err-adapter.log &

重新部署啓動,最後結果是發現全部都啓動成功了

結果

通過添加了nohup命令和source ~/.bash_profile之後,後臺程序順利啓動。

總結

使用開源軟件進行開發的時候,遇到的問題及時記錄下來,並找到解決的問題。這樣日積月累,對自己解決問題的能力是很大的提升。

參考鏈接

關於ansible遠程執行的環境變量問題(login shell & nonlogin shelll)
issues-33410

隨緣求贊

如果我的文章對大家產生了幫忙,可以在文章底部點個贊或者收藏;
如果有好的討論,可以留言;
如果想繼續查看我以後的文章,可以左上角點擊關注

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章