こんにちは、ちゃりおです。
最近基本的な使い方がわかってきた気がするので、入門記事を書いてみます。
Supervisorとは
プロセス管理デーモン化のツールです。
例えば、キューワーカの永続化などに使います。(laravelだと公式ドキュメントでも推奨されています)
スーパーバイザは、ユーザーがUNIXライクなオペレーティングシステム上の多数のプロセスを
監視および制御できるようにするクライアント/サーバーシステムです。
AmazonLinux2でSupervisorをインストールしてみる
以下の構成でインストールやってみます。
- AmazonLinux2
- supervisor 4.1.0
公式ドキュメント Supervisor installing
supervisorインストール
yumからインストールするとバージョンが古いので、pipでインストールします。
まずは、python3とpipをインストールします。
$ sudo yum install python3
$ sudo pip3 install supervisor
インストールできたらバージョン確認。
$ supervisord --version
4.1.0
confファイル作成
echo_supervisord_conf
にconfファイルのsampleがあるので、それを使ってconfファイルを作ります。
$ echo_supervisord_conf > ~/supervisord.conf
$ sudo mv ~/supervisord.conf /etc/supervisord/supervisord.conf
includeする用のディレクトリ作っておきます。
$ sudo mkdir /etc/supervisord/conf.d
confファイル編集
supervisord.confの編集だけやります。
conf.d配下は後ほど変更します。
$ sudo cp /etc/supervisord/supervisord.conf /etc/supervisord/supervisord.conf.org
$ sudo vi /etc/supervisord/supervisord.conf
$ diff /etc/supervisord/supervisord.conf.org /etc/supervisord/supervisord.conf
45c45
< ;[inet_http_server] ; inet (TCP) server disabled by default
< ;port=127.0.0.1:9001 ; ip_address:port specifier, *:port for all iface
---
> [inet_http_server] ; inet (TCP) server disabled by default
> port=127.0.0.1:9001 ; ip_address:port specifier, *:port for all iface
45c45
< logfile=/tmp/supervisord.log ; main log file; default $CWD/supervisord.log
---
> logfile=/var/log/supervisord.log ; main log file; default $CWD/supervisord.log
49c49
< pidfile=/tmp/supervisord.pid ; supervisord pidfile; default supervisord.pid
---
> pidfile=/var/run/supervisord.pid ; supervisord pidfile; default supervisord.pid
74,75c74,75
< serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket
< ;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
---
> ; serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket
> serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
168,169c168,169
< ;[include]
< ;files = relative/directory/*.ini
---
> [include]
> files = /etc/supervisord/conf.d/*.conf
サービス登録
supervisord.serviceつくります。
$ sudo vi /etc/systemd/system/supervisord.service
[Unit]
Description=supervisord - Supervisor process control system for UNIX
Documentation=http://supervisord.org
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/bin/supervisord -c /etc/supervisord/supervisord.conf
ExecReload=/usr/local/bin/supervisorctl reload
ExecStop=/usr/local/bin/supervisorctl shutdown
User=root
[Install]
WantedBy=multi-user.target
下記のコマンドを実行して、statusがactiveになればOKです。
$ sudo systemctl start supervisord
$ sudo systemctl status supervisord
自動起動も設定しておきます。
$ sudo systemctl enable supervisord
プログラムをデーモンにしてみる
テスト用のスクリプトを用意します。
実行すると1秒ごとに、「Hello, world!」と表示されるだけのスクリプトです。
$ vi hello.sh
#!/bin/bash
while :; do
echo "Hello, world!"
sleep 1
done
$ chmod +x hello.sh
conf.dにファイルを追加します。
$ sudo vi /etc/supervisor/conf.d/hello.conf
[program:hello]
command=/home/ec2-user/hello.sh
process_name=%(program_name)s_%(process_num)02d
autostart=true
autorestart=true
user=ec2-user
numprocs=1
redirect_stderr=true
stdout_logfile=/tmp/hello.log
supervisordを再起動します。
$ sudo systemctl restart supervisord
ログを確認すると、「Hello world!」と表示されているはずです。
$ tail -f /tmp/hello.log
Hello world!
Hello world!
Hello world!
Hello world!
supervisorctrlでプロセスの起動停止ができます。
supervisorctrl status [all/プロセス名]
supervisorctrl start [all/プロセス名]
supervisorctrl stop [all/プロセス名]
supervisorctrl restart [all/プロセス名]
ハマったポイント
ログのディレクトリ作ってなくて動かない
「program」のconf内のファイルにログの出力先を指定するところがあります。
そのディレクトリを事前に作っていなくて、「supervisord」を起動しようとして「status」が「failed」になってしまいました。
出力先のディレクトリはあらかじめ作っておきましょう。
inet_http_serverコメントアウトしたままで、supervisorctrl動かない
supervisor3.0以降は、inet_http_serverが必須になったみたいです。
コメントアウトにしたままで、supervisorctlを実行すると「http://localhost:9001 refused connection」と出てしまいます。
「デフォルトでコメントにするなよ!」と思うのですが、「supervisord.conf」変えるときにそこも変えておきましょう。
http://supervisorctl 3.3.1 http://localhost:9001 refused connection
autorestart trueにしてなくて停止したままになっていた
supervisorで管理していたプロセスが停止して、1日ほど気づけなかった事がありました。
autorestartをtrueにしておくと、停止しても自動で(デフォルト5回)起動を試みるので設定したほうがいいです。
あとはプロセス監視もしておくとなお良いです。
まとめ
今回は、Supervisorについて書いてみました。
amazonlinux2だとyumでインストールしようとすると、古いバージョンが入ってしまいます。
それが嫌だったので、試しつつやってみました。
面倒ではありましたが、supervisorについてより理解できた気がするので良かったです。


