2015年4月24日金曜日

CentOS でsupervisor を使ってシェルスクリプトとデーモン化してみた

概要

Supervisor は launchd, daemontools, runit のようなプロセスをデーモン化するためのツールです
デーモン化をプログラム上で実装するのが面倒くさい場合に使えるツールです
今回はCentOS上で supervisor を使ってシェルスクリプトをデーモン化してみました

環境

  • CentOS 6.3 64bit
  • supervisor 2.1.9

Supervisorのインストール

今回はepelリポジトリを追加してyumでsupervisorをインストールします
理由はインストールが簡単なのと起動スクリプトなど必要なリソースが揃っているからです
ただ、最新版のsupervisorをインストールしたい場合はyumではなくpythonのパッケージ管理の仕組みであるpiporeasy_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 件のコメント:

コメントを投稿