概要
Supervisor は launchd, daemontools, runit のようなプロセスをデーモン化するためのツールです
デーモン化をプログラム上で実装するのが面倒くさい場合に使えるツールです
今回はCentOS上で supervisor を使ってシェルスクリプトをデーモン化してみました
環境
- CentOS 6.3 64bit
- supervisor 2.1.9
Supervisorのインストール
今回はepelリポジトリを追加してyumでsupervisorをインストールします
理由はインストールが簡単なのと起動スクリプトなど必要なリソースが揃っているからです
ただ、最新版のsupervisorをインストールしたい場合はyumではなくpythonのパッケージ管理の仕組みであるpip
oreasy_install
を使ってインストールすることをおすすめします
もしくはCentOSの6.6以上を使えばepelでも3系がインストールできるかもしれません
supervisorの2系はバージョン的にはかなり古く特にconfigファイルの書き方が3系とは全然違うのでご注意ください
rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
yum clean all
yum -y install supervisor
バージョンを確認してみます
rpm -qa | grep supervisor
supervisor-2.1-9.el6.noarch
デーモン化するシェルスクリプトの準備
基本は何でもOKです
今回は自分がGistで公開しているシェルスクリプトを使ってみます
何をするシェルスクリプトか説明すると
- 指定したディレクトリ配下にあるファイルを別の指定したディレクトリに1ファイルずつ移行するシェルスクリプト
になります
以下一応、実行するためのインストール用のコマンドを記載しておきます
mkdir /opt/supervisor
cd /opt/supervisor
wget https://gist.githubusercontent.com/kakakikikeke/10dc7dc6dca2f0675989/raw/342f9defd96862a97573a3e08a2ac6737ce9ee6b/dir2dir.sh
wget http://www.mitchy-world.jp/itmemo/shell/download/06.zip
unzip 06.zip
mv 06/common1.sh .
sed -i -e 's/LOG_DIR=\/home\/mitchy\/log\//LOG_DIR=`pwd`"\/"/' common1.sh
sed -i -e 's/SYSTEM_LOG_LEVEL=INFO/SYSTEM_LOG_LEVEL=DEBUG/' common1.sh
sed -i -e 's/.\/common1.sh/\/opt\/supervisor\/common1.sh/' dir2dir.sh
デーモン化するためのsupervisorスクリプトを作成
supervisor.conf
という設定ファイルがあるのでこれに直接記載します
[include]
という仕組みがありこれを使って別ファイルに設定を切り出すことも可能です
- vim /etc/supervisord.conf
[program:dir2dir]
command=sh /opt/supervisor/dir2dir.sh /opt/supervisor/target_dir/ /path/to/source_dir/
autostart=true
autorestart=true
logfile=/var/log/supervisor/dir2dir.log
command
はそのまんまでsupervisor上で動作させるコマンドを記述します
シェル内でファイルの参照などで相対パスを記載している場合にうまく動作しない場合があるので絶対パスで記載しておくといいです
autostart
はsupervisorの起動と同時にプログラムを起動するかのオプションです
trueの場合は自動で起動します
autorestart
は起動しているプログラムがハングしたり何かしたらの影響で停止したときに自動で再起動させるかどうかを指定します
trueの場合はsupervisorが自動で再起動してくれます
他にもいろいろとオプションが存在しています
Webで検索するか/etc/supervisord.conf
内にサンプルもあるので参考にするといいと思います
Supervisorを起動
ではsupervisorを起動してみましょう
service supervisord start
でOKです
supervisorには管理用のコマンドが用意されておりsupervisorctl
を使うと現在supervisor上で動作しているプロセスの状態を確認することができます
supervisorctl で状態の確認
まずsupervisorctl
を実行してみましょう
するとsupervisor>
というプロンプトに変更すると思います
この状態でsupervisorctl用のコマンドを発行するができます
主に使用するのは以下の通りです
- status
動作中のプラグラムの一覧を表示します
起動中のプログラムはRUNNINGになっています、FATALはプログラム自体が壊れている可能性があるのでプラグラムの修正が必要です - start
指定したプログラムを起動します - stop
指定したプログラムを停止します - reload
supervisor.confを書き換えた場合にgracefulに設定を反映することができます
上記以外のコマンドはhelp
というコマンドで確認できます
更に詳細にコマンドを確認したい場合はhelpのあとに確認したいコマンドを付与して実行すればOKです
ログを確認してみる
ログはプログラム本体が吐くログはもちろん出力されます
それとは別にsupervisorが各プログラムごとにログを出力してくれています
今回の場合はsupervisor.confに記載したlogfile
という項目のパスに出力してくれています
基本的には何も出力されませんが、supervisorがプログラムを再起動した場合や開始、終了時にログを残してくれます
最後に
今回はバージョン2で実施しました
冒頭も記載しましたがバージョン3ではconfigファイルの書き方が変わっているのでご注意ください
また、今回のシェルもそうですがシェル自体が終了してしまうシェルの場合リトライを何度か実施して最終的にはFATALのステータスになります
supervisorの使いどころとしてはnohupや&
でバックグラウンド実行していたプログラムをsupervisorに移行する感じでだと思います
0 件のコメント:
コメントを投稿