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