Supervisor入門

# Supervisorとは

プロセスの制御・管理を行えるシステム。

具体的には、プロセスをデーモン化し、クラッシュした際の再起動などを行ってくれます。

例えば、私のアサインしているプロジェクトではLaravelのキューワーカーを使用し、プログラムを継続して並行稼働する際に重宝しています。

ただ、Windowsユーザーには残念ですが、UNIXライクなのでWindowsでは起動しません。

公式ドキュメント
http://supervisord.org/running.html#adding-a-program
# この記事について

Supervisorの基本的な使い方について必要最小限の内容を書いていきます。

# インストール

今回はAWSで適当に立ち上げたEC2インスタンス上で、実践していきます。

サーバーアクセス〜スーパーユーザー切り替え

```
...$ ssh -i ~/.ssh/udemy_sample2.pem ec2-user@54.65.141.153
[ec2-user@ip-172-31-37-208 ~]$ sudo su -
```

supervisorをインストール
詳しく調べていませんが、`easy_install`がいいらしいです。

```
[root@ip-172-31-37-208 ~]# sudo easy_install supervisor
Searching for supervisor
Reading https://pypi.python.org/simple/supervisor/
Downloading https://files.pythonhosted.org/packages/ca/1f/07713b0e1e34c312450878801d496bce8b9eff5ea9e70d41ff4e299b2df5/supervisor-4.1.0-py2.py3-none-any.whl#sha256=a76b2f77a560f2dc411c0254a4eb15f555e99faac48621b0f1fc9ab013944f47
Best match: supervisor 4.1.0
Processing supervisor-4.1.0-py2.py3-none-any.whl
Installing supervisor-4.1.0-py2.py3-none-any.whl to /usr/lib/python2.7/site-packages
writing requirements to /usr/lib/python2.7/site-packages/supervisor-4.1.0-py2.7.egg/EGG-INFO/requires.txt
Adding supervisor 4.1.0 to easy-install.pth file
Installing echo_supervisord_conf script to /usr/bin
Installing pidproxy script to /usr/bin
Installing supervisorctl script to /usr/bin
Installing supervisord script to /usr/bin

Installed /usr/lib/python2.7/site-packages/supervisor-4.1.0-py2.7.egg
Processing dependencies for supervisor
Finished processing dependencies for supervisor
```

# 構成ファイルの作成

```
[root@ip-172-31-37-208 ~]# echo_supervisord_conf > /etc/supervisord.conf
```

構成ファイルがetc配下に置かれます。

# デーモン化するプログラムの追記（個別管理しない場合）

構成ファイルを個別管理しない場合はsupervisord.confに以下のようにデーモン化したいプログラムを追記してください。

```supervisord.conf
[program:foo]
command=/bin/cat
```

# デーモン化するプログラムの追記（個別管理する場合）

構成ファイルを個別管理する場合は以下の手順で進めてください。



個別のプログラム構成ファイル保管用ディレクトリ作成

```
[root@ip-172-31-37-208 ~]# mkdir /etc/supervisord.d
```



supervisord.confの修正

変更箇所（変更前）

```supervisord.conf
;[include]
;files = relative/directory/*.ini
```

変更箇所（変更後）

```supervisord.conf
[include]
files = /etc/supervisord.d/*.conf
```

これで、/etc/supervisord.d配下に作成する個別の構成ファイルも読み込むようになります。



個別のプログラム構成ファイル作成

```
[root@ip-172-31-37-208 ~]# vi /etc/supervisord.d/foo.conf
```

以下のように作成

```foo.conf
[program:foo]
command=/bin/cat
```



# 使用するコマンドについて

`supervisord`

supervisorの起動に使用します。

プログラムの細かい操作等では使用しません。

`supervisorctl`

実行されたプログラムの操作で使用します。詳しい操作方法は以下URLを参照。



# Supervisorの起動〜プログラムの実行

Supervisorを起動。

```
[root@ip-172-31-37-208 ~]# /usr/bin/supervisord -c /etc/supervisord.conf
```

`/usr/bin/supervisord`だけでも起動しますが、その場合は構成ファイルの場所を順番に検索しに行く為、cオプションを使用し、構成ファイルの絶対パスを指定した方がよさそうです。



構成ファイルのプログラム確認。

```
[root@ip-172-31-37-208 etc]# /usr/bin/supervisorctl status
foo                              RUNNING   pid 29747, uptime 0:02:30
```

Supervisor起動時に構成ファイルに記述しているプログラムは自動で実行されるっぽいです。



試しにkill。

```
[root@ip-172-31-37-208 etc]# kill -9 29747
[root@ip-172-31-37-208 etc]# /usr/bin/supervisorctl status
foo                              RUNNING   pid 29761, uptime 0:00:03
```

プロセスIDが変わり、再起動していることを確認。



プロセスを停止してみる。

```
[root@ip-172-31-37-208 etc]# /usr/bin/supervisorctl stop foo
foo: stopped
[root@ip-172-31-37-208 ~]# /usr/bin/supervisorctl status
foo                              STOPPED   Mar 29 01:17 AM
```

プロセスが停止していることを確認。



プロセスを削除してみる。

```
[root@ip-172-31-37-208 etc]# /usr/bin/supervisorctl remove foo
foo: removed process group
[root@ip-172-31-37-208 etc]# /usr/bin/supervisorctl status
[root@ip-172-31-37-208 etc]#
```

プロセスがお亡くなりになられていることを確認。



新しいプログラムを追加し、フォアグラウンドで実行してみる。

supervisord.confに以下を追加

```supervisord.conf
[program:foo2]
command=watch -n 1 `date`
```

構成ファイルを読み込み、プロセス開始

```
[root@ip-172-31-37-208 etc]# /usr/bin/supervisorctl reread
foo: available
foo2: available
[root@ip-172-31-37-208 etc]# /usr/bin/supervisorctl add foo2
foo2: added process group
[root@ip-172-31-37-208 etc]# /usr/bin/supervisorctl status
foo2                             RUNNING   pid 1177, uptime 0:00:04
[root@ip-172-31-37-208 etc]# /usr/bin/supervisorctl fg foo2
Every 1.0s: `date`                                      Sun Mar 29 04:24:25 2020

sh: Sun: command not found
```

フォアグラウンドでの実行を確認。

Ctl+Cで抜けられます。（もちろんプロセスはデーモン化されたまま）



# コマンド一覧

よく使いそうなものを抜粋しました。

`status`

プロセスのステータスの状態を確認。

`reread`

構成ファイルの読み込み。

この段階ではプログラムは追加も削除もされない。

`add <name>`

構成ファイルに記述したプログラムの適用（プロセス開始）。

`remove <name>`

停止しているプロセスの削除。

`restart <name>`

プロセスの再起動。

これだけでは、構成ファイルの内容は読み込まれないので注意。

`stop`

プロセスの停止。

`start`

プロセスの開始。

`update`

構成ファイルの再読み込み、プログラムの再起動。

設定内容に変更のあったプログラムのみ再起動される？

`reload`

Supervisorのデーモンの再起動。



※詳しくは公式ドキュメント参照



# まとめ

便利！！！！！