Supervisor 是由 python 所寫的一套進程管理系統,可以監控指定的程式,當程式崩潰停止執行時,將程式重啟
Supervisor 有分成 (1) server 主程式 與 (2) client process
(1) server 主程式: 是由 supervisor 執行 supervisor.conf 設定檔所啟動
(2) client process: 則由 supervisorctl 來控制 process
在運行過程,是以C/S模式來運行,也就是由 client process (supervisorctl) 將守護進程的訊息傳送給 server 主程式(supervisord),開始啟用守護進程服務。
一般操作設定 supervisor 都會建議在 root 權限下進行,
這裏則說明如果不在 root 權限的環境,如何安裝及使用
安裝
supervisor 是由 python 開發,因此可直接用 pip 安裝:
pip install supervisor
or
sudo apt-get install supervisor
生成 server 主程式的配置文件
安裝完 supervisor 之後,就可以透過 echo_supervisord_conf
先在使用者根目錄生成 supervisord.conf
CVT2HUGO: 指令來輸出配置
cd ~/
echo_supervisord_conf > supervisord.conf
再將檔案移動到 /etc
### Mac
mv supervisord.conf /usr/local/etc/
### Linux
mv supervisord.conf /etc/
建立 client process 設定檔 & Log
接著在使用者根目錄建立 client process 設定檔及 log 資料夾
~/supervisor/log/ - 存放 log
~/supervisor/conf.d/ - 存放監控設定檔
之後就將監控設定檔案放在這裡面
修改 server process 設定檔文件
回到 server process 設定檔案 supervisord.conf,將 files 註解移除,並且輸入指向 client process 設定檔案位置(須留意的是,都要寫成絕對路徑)
vim /usr/local/etc/supervisord.conf
在最後兩行 ; 註解移除,並且修改 files 指向
[include]
files = /Users/liaoxiangru/supervisor/conf.d/*.conf
啟動 supervisor server process 服務
啟動主程式,可透過 supervisor -c 選項來指定配置文件的路徑 即可啟動:
### Mac
supervisord -c /usr/local/etc/supervisord.conf
### Linux
supervisord -c /et/supervisord.conf
查看 supervisor 主程式服務運行狀態
ps aux|grep superviosrd
會得到類似這樣的資訊
username 22092 0.0 0.0 4276968 908 s001 S+ 11:27下午 0:00.00 grep --color=auto superviosrd
建立一個 Laravel 守護進程
[建立 laravel client 守護進程設定檔]
這裡我們建立一個 laravel 服務的守護進程 來作為範例,
當我們執行這個 process 時,要能自動啟用 webserver,並且中斷後會自動連線
首先,建立 client process 的設定檔案:
vim ~/supervisor/conf.d/laravel-project.conf
編輯內容
[program:laravel-project]
command = php /Users/username/docker_project/laravel-project/artisan serve
directory = /Users/username/docker_project/laravel-project/
user = username
autostart = true
autorestart = true
stdout_logfile = /Users/username/supervisor/log/laravelapi.log
stderr_logfile = /Users/username/supervisor/log/laravelapi_err.log
environment = NODE_ENV='testing'
[啟動進程]
接著,執行 supervisor process 必須透過主控台 supervisorctl 來操作
通常可以先執行 supervisorctl 進入控制環境:
supervisorctl
接著會進入supervisor進程控制
supervisor>
就能下各種指令,例如 start, reload, reread, stop
但這裡示範,我們都一律用 supervisorctl + 指令的方式,清楚知道是在用進程控制
[重新載入監控及設定]
每次有新增或修改設定檔案,都要重新執行 reread, reload
supervisor>reread
supervisor>reload
查詢目前新增的 laravelapi 是否已經執行
supervisor>status
laravel-project RUNNING pid 21417, uptime 0:01:46
[停止process]
supervisor>stop laravel-project
查詢目前新增的 laravelapi 是否已經執行
supervisor>status
laravel-project FAILE pid 21417, uptime 0:01:46
注意!當執行停止守護進程,只是將守護的功能停止,該進程還是會繼續運行。
如果要中斷進程,就要手動方式執行 kill。
停止 supervisor process 及終止 php artisan serve
停止process
sudo supervisorctl stop laravel-project
先查看目前程序
lsof -i -P -n | grep LISTEN
會得到類似下方的字串
rapportd 21424 username 3u IPv4 0xf9ddddd52b6de08d 0t0 TCP *:8000 (LISTEN)
手動刪除指定程序
kill -s SIGTERM 21424
在刪除的同時,應該會在 ~/supervisor/log/laravel-project.log 的紀錄中多了一筆重啟紀錄
Laravel development server started: <http://127.0.0.1:8000>
關閉 supervisor server
supervisor server 主要由 supervisor.sock 來維護,因此關閉方式就是直接將 socket 啟用的連線刪掉
首先列出目前在執行的 supervisor server
ps -ef | grep supervisord
會得到類似這樣的回應
501 21255 1 0 10:35下午 ?? 0:01.07 /usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python /usr/local/bin/supervisord
501 22361 21183 0 11:36下午 ttys001 0:00.00 grep --color=auto supervisord
手動刪除連線
kill -s SIGTERM 21255
kill -s SIGTERM 22361
檢查 client 狀態
supervisorctl status
應該會顯示下方文字,表示 server 已停止連線
unix:///tmp/supervisor.sock no such file
重新啟用 supervisor
執行下方語句就能重新啟用 supervisor server
supervisord