amazon linuxにsupervisorを入れたメモ

# supervisorの環境構築

バイトでawsにsupervisorをインストールした時のメモ。
なんか途中からroot権限もらえたけどuserでも問題なし。

### 環境

```
[ec2-user@ip-xxx-xx-xx-xx xxx]# python --version
Python 2.7.12

[ec2-user@ip-xxx-xx-xx-xx xxx]$ cat /etc/system-release
Amazon Linux AMI release 2017.09

[ec2-user@ip-xxx-xx-xx-xx xxx]$ arch
x86_64
```

[#platform-requirements](http://supervisord.org/introduction.html#platform-requirements)
> Supervisor is known to work with Python 2.4 or later but will not work under any version of Python 3.


### インストール

[ドキュメント](http://supervisord.org/installing.html)によるとeasy_installでのインストールが好ましいとのこと。

easy_installとはpythonパッケージ管理ツールで今回のaws環境にはすでに構築済みであった。

```
[ec2-user@ip-xxx-xx-xx-xx xxx]# which easy_install
/usr/bin/easy_install
```

easy_install supervisorでインストール。
また作業時(2018年3月)の最新版は3.3.4であった。

```
[ec2-user@ip-xxx-xx-xx-xx xxx]# sudo easy_install supervisor
・・・
・・・
Installed /usr/local/lib/python2.7/site-packages/meld3-1.0.2-py2.7.egg
Finished processing dependencies for supervisor
```

```
[root@ip-xxx-xx-xx-xx xxx]# supervisord -v
3.3.4
```

###  設定ファイルを作成する。

easy_installを使ったインストールでは設定ファイルを自分で作成する必要がある。

echo_supervisord_conf コマンドで設定ファイルの雛形が出力されるのでこれを/etc/supervisord.confに書き出す。

```
echo_supervisord_conf > /etc/supervisord.conf
```

これに下記編集を加えた。

``` /etc/supervisord.conf

*中略*

[supervisord]
logfile=/home/ec2-user/supervisord.log ①

*中略*

[include]
files = supervisord.d/*.conf ②

``` 

①superviso本体のログファイルの出力先を設定する。
今回はhomeディレクトリー配下にしたが/var/log/supervisor/supervisord.logが一般的なよう。

②子プロセスを各プロセスごとに管理できるようにする。
そのためプロセス設定ファイルは/etc/supervisord.d配下に作成する


### プロセス設定ファイルを作成する

動作確認用に10秒毎に現在時刻を出力するシェルを用意した。

``` /home/ec2-user/hello.sh

#!/bin/sh
while true 
do
sleep 10s
echo "hello "`date`
done
```

このシェルを実行するプロセス設定ファイルを以下のように作成した。


``` /etc/supervisord.d/hello.conf 

[program:hello] //プロセス名
directory=/home/ec2-user //実行ディレクトリ
command=/bin/sh hello.sh //実行コマンド
user=root
autorestart=true  ; プロセスダウン時に自動再起動
stdout_logfile=/home/goapp/hello.log ; 標準出力ログ
redirect_stderr=true  ; エラー出力を標準出力にリダイレクト
```

各設定項目の詳細は[こちら](http://supervisord.org/configuration.html#program-x-section-settings)


設定は以上である。
supervisorを起動し動作確認ができるはずである

```
[ec2-user@ip-xxx-xx-xx-xx ~]$ supervisord
[ec2-user@ip-xxx-xx-xx-xx ~]$ cat /home/ec2-user/hello.log
hello Thu Mar 1 14:18:33 JST 2018
hello Thu Mar 1 14:18:43 JST 2018
hello Thu Mar 1 14:18:53 JST 2018
```

## initスクリプト


サーバーの起動時に自動でsuprevisorを起動するための設定である。
[Running supervisord automatically on startup](http://supervisord.org/running.html#running-supervisord-automatically-on-startup)
[こちら](https://github.com/Supervisor/initscripts)にlinuxの各ディストリビューションごとのinitスクリプトが用意されてる。amazon linuxのはないがredhat-init-equeffelecで良いらしい。

```
$ sudo curl -o /etc/init.d/supervisord https://raw.githubusercontent.com/Supervisor/initscripts/master/redhat-init-equeffelec
$ sudo chmod 755 /etc/init.d/supervisord
```

ダウンロードできたらsupervisord及びsupervisorctlのパスを変更する。

``` /etc/init.d/supervisord

*中略*
# Path to the supervisorctl script, server binary,
# and short-form for messages.
supervisorctl=/usr/lobal/bin/supervisorctl
supervisord=${SUPERVISORD-/usr/local/bin/supervisord}
```

```
sudo /etc/init.d/supervisord start
```

すでに起動済みであれば Another program is already listening on と出力される。

## supervisorctl


各プロセスを操作できる。
supervisorctlを実行すると対話式のシェルが現れるが直接実行できる。

```
[root@ip-xxx-xx-xx-xx xxx]# supervisorctl status
hello                            RUNNING   pid 2555, uptime 1:21:57
```

各種コマンドについては[こちら](https://papix.hatenablog.com/entry/2015/08/05/131113)にまとめられている。

同サイトに記載されているように、各プロセスが実行するファイルが変更された場合 (この例では/home/ec2-user/hello.sh)

```
supervisorctl restart hello
```

で変更が反映されるがプロセスの設定ファイルが変更された場合は（この例では/etc/supervisord.d/hello.conf)

```
supervisorctl reread/update hello
```

をする必要がある。

## その他

### root以外のユーザからsupevisorctlコマンドを実行する

rootユーザー以外でsupevisorctlコマンドを実行すると以下のように出力された。

```
[ec2-user@ip-xxx-xx-xx-xx ~]$ supervisorctl
error: <class 'socket.error'>, [Errno 13] Permission denied: file: /usr/lib64/python2.7/socket.py line: 228
```

[Supervisorで簡単にデーモン化 - Qiita](https://qiita.com/yushin/items/15f4f90c5663710dbd56#supervisord%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%95%E3%82%A3%E3%82%B0)

このステップを実行することでuserでコマンドが実行できるようになった。



### Another program is already listening on

```
[root@ip-xxx-xx-xx-xx ~]# ps aux | grep super 
root      2551 12.6  1.7 220496 17844 ?        Ss   11:11   4:12 /usr/bin/python2.7 /usr/local/bin/supervisord -c /etc/supervisord.conf
root     30978  0.0  0.2 110468  2044 pts/0    S+   11:45   0:00 grep --color=auto super
```

supervisor本体がpid 2551で行われているので

```
[root@ip-xxx-xx-xx-xx ~]# sudo /etc/init.d/supervisord start
Starting supervisord: Error: Another program is already listening on a port that one of our HTTP servers is configured to use.  Shut this program down first before starting supervisord.
```

と出たら

```
kill 2551
```

をすれば良い