supervisor 是一個可以管理進程的軟件,並監控進程狀態,異常退出時能自動重啟。它是通過fork/exec的方式把這些被管理的進程當作supervisor的子進程來啟動,這樣只要在supervisor的配置文件中,把要管理的進程的可執行文件的路徑寫進去即可。supervisor還提供了一個功能,可以為supervisord或者每個子進程,設置一個非root的user,這個user就可以管理它對應的進程。比如我們要用它管理elasticsearch 就可以把管理es的專屬用戶密碼 寫入配置文件。
- 網上有很多supervisor的安裝教程,也比較簡單。這里就不再贅述。開始使用的時候需要先看一看 配置文件 路徑:/etc/supervisord.conf 。
因為我們可能會用 supervisor 管理很多進程 寫在一個文件會很大,所以通常需要 每一個 進程獨立出一個 以 .ini 為后綴的配置文件 單獨管理。
按照配置文件默認的加載路徑 supervisord.d/ 下創建了 elasticsearch.ini 文件。
command=/usr/local/elasticsearch-6.6.1/bin/elasticsearch ; 運行程序的命令
autorestart=true ; 程序意外退出是否自動重啟
autostart=true ; 是否自動啟動
stderr_logfile=/var/log/supervisor/elasticsearch_err.log ; 錯誤日志文件
stdout_logfile=/var/log/supervisor/elasticsearch_out.log ; 輸出日志文件
environment=JAVA_HOME=/usr/local/jdk1.8.0_201 ; 進程環境變量
user=ela ; 進程執行的用戶身份
password=ela
stopsignal=INT
startsecs=10 ; 自動重啟間隔
寫入上圖中的配置信息(當時沒有寫 environment JAVA_HOME 的配置)
所以 執行 supervisorctl reload 、 supervisorctl restart elasticsearch 總是失敗。
2、開始排錯 (在坑里的感覺真不好)
第一個直覺就是去查看 supervisor的日志了 以為 elasticsearch 根本就沒啟動 也不會輸出 日志
所以一直在查 exit status 1; not expected elasticsearch entered FATAL state, too many start retries too quickly 這個問題 ,然后 會發現管理很多其他的 進程 出錯時也會 報這種錯 也試了很多 搜到的 解決方法 ,但是結果肯定都不適用。
3、出坑
找解決方法找的 都眼疼了 。 偶然的契機我去 看了眼 elasticsearch.ini 配置文件中 指定的 輸出日志 和 錯誤 輸出日志 。驚奇的發現 人家已經默默滴 記錄了好多日志啦(手動捂臉) 。
所以 直接打開 error 日志
所以 真相浮出水面 直接去配置文件添加 JAVA_HOME 環境變量 再重新reload 、 start 終於運行了。