Supervisor の使用方法をまとめました。
Supervisorのインストール
Supervisor とは Python 製のプロセス管理ツールで、プログラムなどを簡単にデーモン化することができます。インストールは以下の通りです。
$ sudo apt-get install supervisor $ sudo yum install supervisor
インストールが完了すると起動スクリプトが/etc/init.d/supervisor
に、設定ファイル類が/etc/supervisor
以下に作成されます。インストール時に作成される設定ファイルには最低限の設定が書かれていますが、echo_supervisord_conf
コマンドを使用すると様々な設定項目が書かれたファイルを作成できます。
$ echo_supervisord_conf > /etc/supervisor/supervisord.conf
操作にはsupervisord
とsupervisorctl
コマンドを使用します。Supervisor を使用するには supervisord であらかじめ起動しておく必要があります。supervisorctl は Supervisor のプロセスを管理するコマンドです。基本的に操作はsupervisorctl
を使用します。
$ sudo service supervisor start
直接コマンドで起動する場合は以下の通りです。-c
で設定ファイルを指定してください。停止コマンドは無いので停止したい時はプロセスをkill
する必要があります。-n
オプションを使用するとフォアグラウンドで起動するためctrl + c
で停止可能です。
$ sudo supervisord -c /etc/supervisor/supervisord.conf
pip でもインストール出来ますが起動スクリプトは作成しないといけません。その場合は このページ なども参考になります。
Installing — Supervisor 3.3.1 documentation
GitHub - Supervisor/initscripts: User-contributed OS init scripts for Supervisor
Supervisor設定ファイル
Supervisor 全体の設定ファイルが/etc/supervisor/supervisord.conf
になります。起動設定やログファイル、PIDディレクトリなどを記述していきます。実行するプロセスに関しては別ファイルにして[include]
セクションで読み込むのが分かり易いです。
Configuration File — Supervisor 3.3.1 documentation
管理プロセスファイル
Supervisor で管理するプロセスの設定ファイルを作成します。supervisord.conf
ファイル内に一緒に記述することもできますが、基本は supervisord.conf 内の[include]
セクションに指定したディレクトリ内にファイルを作成します。
[include] files = /etc/supervisor/conf.d/*.conf
program のセクションが 1 つの管理プロセスになります。
[program:testapp] command=/home/ubuntu/projects/testapp/run.bash autostart=true autorestart=true stopsignal=QUIT stdout_logfile=/var/log/supervisor/testapp.log stderr_logfile=/var/log/supervisor/testapp-error.log user=ubuntu directory=/home/ubuntu/projects/testapp environment=
directory
で指定したディレクトリでcommand
で指定したコマンドがuser
によって実行されます。例えばbundle exec rails s
などのコマンドもそのまま記述できますが、実行時の環境変数などの問題もあるので起動シェルを用意するのが一般的かと思います。シェルの場合は実行権限を付与するのを忘れないように。
stdout_logfile
やstderr_logfile
は実行されたコマンドが出力する標準出力と標準エラー出力が記録されます。stopsignal
は停止する際に送られるシグナルです。
他にもlogfile
は設定でローテートする事も可能です。その他のコマンドは以下ページを参照して下さい。
Configuration File — Supervisor 3.3.1 documentation
supervisorctlコマンド
supervisorctl
はプロセスを管理するコマンドラインツールです。引数なしか-i
オプションを付けて実行するとインタラクティブシェルが起動します。
$ sudo supervisorctl sample_program STOPPED Feb 26 01:32 PM supervisor>
通常は上記の方法ではなくsupervisorctl <command> <args>
で実行します。主なコマンドは以下の通りです。コマンドの一覧はsupervisorctl help
で確認できます。
コマンド | 引数 | 機能 |
---|---|---|
status | none <name> |
プロセスのステータスを取得する。 |
start | <name> <gname>:* all |
プロセスを起動する。 |
stop | <name> <gname>:* all |
プロセスを停止する。 |
reread | - | デーモンの設定ファイルの読込み。 |
add | <name> | 指定したプロセスやグループを管理対象に追加して起動する。 |
remove | <name> | 指定したプロセスやグループを管理対象から削除する。 |
update | - | 全ての設定ファイルを再読込みして変更があればadd やremove をする。 |
restart | <name> <gname>:* all |
プロセスを再起動する。reread で再読込していてもadd して有効になっていなければ設定は適用されない。 |
reload | - | Supervisorデーモンを再起動してプロセスを全て起動する。デーモンの再起動なので設定も全て再読込みされて最新になる。 |
tail | <name> [stdout|stderr] |
対象プロセスのログを確認する。Linux の tail コマンドと同様に-f オプションも使える。デフォルト stdout |
clear | <name> all |
対象プロセスのログファイル(プロセスファイルで指定しているstdoutとstderrのlogfile)をクリアする。 |
version | - | Supervisord のバージョンを確認する。 |
Web管理画面
Supervisor にはWeb上からプロセスの管理ができるようになっています。supervisord.conf
に以下の設定を記述しましょう。echo_supervisord_conf
で設定ファイルを作成している場合はコメントアウトされているはずです。Supervisor を再起動したらブラウザからhttp://<ip>:9001
にアクセスできるようになります。
[inet_http_server] ; inet (TCP) server disabled by default port=0.0.0.0:9001 ; (ip_address:port specifier, *:port for all iface) username=user ; (default is no username (open server)) password=123 ; (default is no password (open server))