Linux
AWS
supervisor

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

Supervisor is known to work with Python 2.4 or later but will not work under any version of Python 3.

インストール

ドキュメントによると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  ; エラー出力を標準出力にリダイレクト

各設定項目の詳細はこちら

設定は以上である。
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
こちらに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

各種コマンドについてはこちらにまとめられている。

同サイトに記載されているように、各プロセスが実行するファイルが変更された場合 (この例では/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

このステップを実行することで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

をすれば良い