インフラ

Supervisor入門(AmazonLinux2 + Supervisor4系) インストールからハマったポイント

supervisor

こんにちは、ちゃりおです。

最近基本的な使い方がわかってきた気がするので、入門記事を書いてみます。

Contents

Supervisorとは

プロセス管理デーモン化のツールです。
例えば、キューワーカの永続化などに使います。(laravelだと公式ドキュメントでも推奨されています)

スーパーバイザは、ユーザーがUNIXライクなオペレーティングシステム上の多数のプロセスを
監視および制御できるようにするクライアント/サーバーシステムです。

公式ドキュメント Supervisor

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についてより理解できた気がするので良かったです。

公開鍵秘密鍵-min
踏み台サーバの鍵(公開鍵・秘密鍵)の管理方法について比較してみたこんにちは、ちゃりおです。 みなさんは、踏み台サーバの鍵の管理どうしてますか。 ユーザごとにアカウント作ったり、秘密鍵を共有していたり...
Ansible 入門前編
[Ansible入門 前編]Ansibleの概要こんにちは、ちゃりおです。 社内へのAnsible啓蒙の一環として、Ansibleの入門記事を書いてみます。 後編には、Dockerを...
SPFのDNSルックアップでハマった件こんにちは、ちゃりおです。 gmail smtpサーバ、SPFの知識が不足してハマったのでまとめてみます。 用語のおさらい 本...