この記事は個人ブログと同じ内容です
プロセス制御システム である Supervisor を実際に動かしてみて、彼のことを理解しようとしてみました。
Supervisor(スーパーバイザー)
Supervisor
スーパーバイザーは、ユーザーがUNIXライクなオペレーティングシステム上の多数のプロセスを監視および制御できるようにするクライアント/サーバーシステムです。
プロセスを監視して、落ちたら起動し直してくれたりするツール。
Supervisor を起動すると、設定している管理対象も一緒に起動してくれる。
実行環境
linux 環境があれば良いので Docker で適当に作成
Dockerfile
FROM amazonlinux:latest # EPEL インストール RUN amazon-linux-extras install -y epel # supervisord インストール RUN yum install -y supervisor # 設定ファイル設置 COPY nginx.ini /etc/supervisord.d/nginx.ini
イメージをビルドして
# イメージをビルド docker build -t amazon_linux_20210417 .
コンテナを起動する
# コンテナ起動 docker run -d --privileged amazon_linux_20210417 /sbin/init # コンテナ ID 出力 -> e17xxxxxxxxxxxxxxxxxxxxxxxx
出力されたコンテナ ID を指定してコンテナの中に入る
# コンテナの中に入る docker exec -it e17 /bin/bash
Supervisor の起動完了
# バージョン確認 $ supervisorctl version 3.4.0
管理対象を設定する
nginx を管理対象にして操作していく。
nginx.ini
[program:nginx] command=/usr/sbin/nginx -g "daemon off;" autostart=true autorestart=true
.ini じゃなくて .conf が良ければ、supervisord.conf の最下部に include があるのでそこを変更する。
/etc/supervisord.conf
[include] files = supervisord.d/*.ini
supervisorctl コマンド
スーパーバイザーを操作するには supervisorctl コマンドを使っていく。
Running supervisorctl - Supervisor 公式
http://supervisord.org/running.html#supervisorctl-command-line-options
管理対象のプロセスの状態を確認する
supervisorctl status ... で管理対象のプロセスの状態を確認できる
status <name> 単一プロセスのステータスを取得する status <gname>:* グループ内のすべてのプロセスのステータスを取得する status <name> <name> 複数の名前付きプロセスのステータスを取得する status すべてのプロセスステータス情報を取得する
nginx の状態を確認してみます。
$ supervisorctl status nginx RUNNING pid 136, uptime 0:34:04
RUNNING しっかり動いてる。
管理対象を再起動する
supervisorctl restart ... でプロセスの再起動ができる
restart <name> プロセスを再起動します restart <gname>:* グループ内のすべてのプロセスを再起動します restart <name> <name> 複数のプロセスまたはグループを再起動します
nginx を再起動してみます。
# 再起動を実行 $ supervisorctl restart nginx nginx: stopped nginx: started # ログ 2021-04-17 07:12:27,752 INFO waiting for nginx to stop 2021-04-17 07:12:27,767 INFO stopped: nginx (exit status 0) 2021-04-17 07:12:27,771 INFO spawned: 'nginx' with pid 152 2021-04-17 07:12:37,814 INFO success: nginx entered RUNNING state, process has stayed up for > than 10 seconds (startsecs)
再起動されました。
プロセスを落としてみる
プロセスを何度か落としてみましたが、何度でも這い上がってくる感じがさすがデーモン化といったところ。
これがスーパーバイザーの力か。恐るべしデーモン閣下。
設定を変更して反映する
nginx の管理設定項目を変更してそれを適用させてみます。
設定ファイルを変更しただけでは適応されないので反映してあげる必要がある。
/etc/supervisord.d/nginx.ini
[program:nginx] command=/usr/sbin/nginx -g "daemon off;" autostart=true autorestart=true # 起動後設定値(秒)より早くプロセスが終了した場合は起動失敗とする startsecs=10 # 起動失敗時のリトライ回数。この回数を超えると FATAL 状態となり起動施行をストップする startretries=2
下の 2 を新たに設定値に加えました。
startsecs 起動後設定値(秒)より早くプロセスが終了した場合は起動失敗とする startretries 起動失敗時のリトライ回数。この回数を超えるとステータスが FATAL になって起動をストップする Section Settings http://supervisord.org/configuration.html#program-x-section-settings
変更を反映するには update を使う。プロセスが再起動されて新しい設定値も読み込まれる。
$ supervisorctl update nginx nginx: stopped nginx: updated process group
一度 remove してから再度 add する
nginx を Supervisor の管理対象から外したのち、再度管理対象にしてみます。
stop でプロセスを止めます。
$ supervisorctl stop nginx
nginx: stopped
remove で管理対象から外します。
$ supervisorctl remove nginx nginx: removed process group
この状態から start でプロセスを開始させようとすると、管理対象から外れているのでエラーになります。
$ supervisorctl start nginx nginx: ERROR (no such process)
再度管理対象とするには add を使います。
$ supervisorctl add nginx nginx: added process group
再度 nginx が起動します。
ちなみに、remove していようが Supervisor 自体を再起動したら起動します。
ステータスが FATAL になったものを再度起動させる
起動に失敗して FATAL になった管理対象ってどうやって復帰させるんだろう。という事で確認。
現在、FATAL の状態
$ supervisorctl status nginx FATAL Exited too quickly (process log may have details)
手動で起動させるには start で行う
start <name> プロセスを開始します start <gname>:* グループ内のすべてのプロセスを開始します start <name> <name> 複数のプロセスまたはグループを開始する start all すべてのプロセスを開始します
nginx を起動してみます。
$ supervisorctl start nginx
nginx: started
FATAL ステータスの nginx を起動できました。
まとめ
Supervisor 実際に触ってみたら操作はとてもシンプルでした。
supervisorctl コマンドは add/start とか、reload/reread/update みたいな、シンプルゆえに雰囲気で触ってると意外とどれがどういう動きをするのかわからないなと思ったので、実際に触ってみて確認して理解が深まったことは収穫でした。