本日も乙

ただの自己満足な備忘録。

CentOSの起動スクリプトを書き方(+注意点)

サーバの起動時や停止時に特定のスクリプトを実行したい場合があります。 例えば、起動時に起動した旨をメール通知したり、停止時にログ(/var/log)をAWS S3などのストレージにバックアップで保存したりできます。若しくはApacheやnginxなどを野良ソースからコンパイルしてインストールした場合、起動スクリプトを作成することもあります。 そこで、今回は簡単な起動スクリプトを作成してみます。ただ、起動スクリプトの作成方法はネットで調べればいくらでも出てきますので、簡単に説明してハマりやすいポイントも押さえたいと思います。

今回の目標

  • サーバの起動時、停止時に特定のスクリプトを実行したい

サーバ環境

スクリプトの作成

今回は簡単に以下のようなサンプルスクリプト(jicoman_test)を作成してみます。 起動時と停止時にメール通知するスクリプトです。

\#!/bin/sh
# chkconfig: 2345 90 10
# description: example init script

PROG="example-script"
LOCK=/var/lock/subsys/$PROG

case "$1" in
  start)
       /bin/touch $LOCK
       echo “Server start!!" | mail -s “init test" -r test@foo.com
       ;;
  stop)
       echo “Server stop!!" | mail -s “init test" -r test@foo.com
       /bin/rm -f $LOCK
       ;;
  *)
       echo “failure !!" >> /var/log/failure.txt
       ;;
esac

ここで何点かポイントを説明します。

  • 2行目では起動するランレベルと起動・停止の順序を指定します。

ランレベルについてはこの記事が参考になります。 26.4. ランレベル (Run Level)とは | Vine Linux CUIユーザーズガイド

# chkconfig: 2345 90 10

2345 ・・・ランレベル2〜5の時にスクリプトを起動する
90 ・・・ 起動時にこのスクリプトを実行する順序(若い番号が先に実行される)
10 ・・・ 停止時にこのスクリプトを実行する順序(若い番号が先に実行される)

注意としては、 スクリプトの起動順序を実行するために必要なプロセスが起動する順序より後に指定してください。たとえば、ログをrync等でバックアップするのにSSHプロセスが停止していたらバックアップを取ることができません。 例のスクリプトでは、mailコマンドを使っているため、Postfixなどのメール送信するために必要なプロセスが起動していないとメール送信できません。僕の環境だと、Postfixがこの起動順序が「80 30」なので、起動・停止において問題ありません。

  • Lockファイル(/var/lock/subsys/$PROG)を設定します。起動時にはLockファイルをtouchコマンドで作成し、停止時にはrmコマンドで削除します。 このLockファイルが無いと停止の処理が実行されないので注意してください *2。 参考: 自動停止のためには /var/lock/subsys 配下にファイルが必要 - メモの日々(2009-02-19)

  • $1 には起動時には「start」、停止時には「stop」が渡されます。case文で分岐させて処理を書いていますが、関数等で別に処理を書いても構いません。

chkconfigで自動起動設定

$ sudo mv jicoman_test /etc/init.d/
$ sudo chkconfig --add jicoman_test
$ sudo chkconfig jicoman_test on

設定できたか確認します。

$ chkconfig --list jicoman_test
jicoman_test       0:off   1:off   2:on    3:on    4:on    5:on    6:off

コマンドでスクリプトの起動確認

serviceコマンドで実行してみます。 実行した後に意図したメールが送信されれば完了です。

# 起動時
$ sudo service jicoman_test start

停止時

$ sudo service jicoman_test stop

最後に

サーバの起動時と停止時に実行する起動スクリプトを書きました。 サーバの起動・停止する機会が無い場合は、あまり恩恵を受けないと思いますが、AWSAutoScalingでEC2インスタンスを頻繁に起動する場合などに重宝すると思います。

*1:Amazon EC2でも同様に作成できます

*2:僕はここでハマりました