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
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
これに下記編集を加えた。
*中略*
[supervisord]
logfile=/home/ec2-user/supervisord.log ①
*中略*
[include]
files = supervisord.d/*.conf ②
①superviso本体のログファイルの出力先を設定する。
今回はhomeディレクトリー配下にしたが/var/log/supervisor/supervisord.logが一般的なよう。
②子プロセスを各プロセスごとに管理できるようにする。
そのためプロセス設定ファイルは/etc/supervisord.d配下に作成する
プロセス設定ファイルを作成する
動作確認用に10秒毎に現在時刻を出力するシェルを用意した。
#!/bin/sh
while true
do
sleep 10s
echo "hello "`date`
done
このシェルを実行するプロセス設定ファイルを以下のように作成した。
[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のパスを変更する。
*中略*
# 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
このステップを実行することで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
をすれば良い