起動スクリプトの書き方

 Linuxでアプリケーションを自動起動したいときは起動スクリプトかいて chkconfig -add してみたいなことをする。

 どんなディストロでも起動スクリプトの書き方は同じなんだろうか(´・ω・`) Redhat, Suse, Debian, CentOSなら行けると思う。例えばPoundはインストールしても起動スクリプトは勝手に出来ないので書く。

普通な場合

# chkconfig [起動レベル] [起動時の優先度] [停止時の優先度]

自分でいれたものだったら、起動レベルは345,45あたりでおk。正直どのレベルに何を置いたらいいのか良く分かってない。起動時の優先度は、低めでいいと思う。逆に停止時は一番最初に止めたいので高めで。

下の2つはいつもテキトーに書いてます(‘A`)

# description: [説明]
# processname: [プロセス名]

起動スクリプト編集します。

$ sudo vi /etc/init.d/pound

内容。

#!/bin/sh
# chkconfig: 345 99 1
# description: Pound
# processname: pound
start(){
  echo -n "starting pound:"
  /usr/local/sbin/pound
  return 0
}
stop(){
  killall pound
  return 0
}
case $1 in
  start)
    start
      ;;
  stop)
     stop
      ;;
esac

上記のような感じに起動スクリプトを書きます。最初に関数を定義して、あとから引数によってしょりを分ける感じです。$1,$2,… で1,2,…番目の引数が取れます。この例だと、 $ sudo /etc/init.d/pound start ってやると $1 に ‘start’ がはいって start() が呼ばれます。

次に実行権限を与えます。その後、chkconfig が使えるディストロの場合と仮定して追加すると以下のようになります。

$ sudo chmod +x /etc/init.d/pound
$ sudo /sbin/chkconfig --add pound

追加されてるか確認してみます。以下のようになってれば成功です。

$ sudo /sbin/chkconfig --list|grep pound
pound           0:off   1:off   2:off   3:on    4:on    5:on    6:off

起動時にパスワード入力を求められる時

 例えば、PoundでSSLをラッピングしてると起動時にパスワードを入力する必要があります。僕はExpect使ってるんですが、もっとスマートな方法があったら教えてほしいです(´∀`)

 まず、Expect のスクリプトを書きます。Expect にちょこっと書いてあるので詳細は省略。

$ sudo vi /usr/local/etc/pound

内容。

#! /usr/bin/expect --
set timeout -1
log_file commit_log
spawn sudo /usr/local/sbin/pound
expect "Enter PEM pass phrase:"
send "pempassword\r"
interact

Enter PEM pass phrase: の部分は予め標準出力される文字列を覚えておく必要がある。そして、実行権限を与える。

$ sudo chmod +x /usr/local/etc/pound

あとは、さっきとほとんど一緒です。 /usr/local/etc/pound を実行すればPoundが立ち上がるようになってるので、それを書くだけです。restart ってのも書いてみた。

#!/bin/sh
# chkconfig: 345 99 1
# description: software proxy Pound
# processname: Pound
# created by arai@a-it.jp 070826
start(){
  echo "starting pound..."
  /usr/local/etc/pound.sh
  return 0
}
stop(){
  echo "stopping pound..."
  killall pound
  return 0
}
restart(){
  echo "restarting pound..."
  killall pound
  /usr/local/etc/pound.sh
  return 0
}
case $1 in
  start)
    start
  ;;
  stop)
    stop
  ;;
  restart)
    restart
  ;;
esac

あとはさっきと同じ様に実行権限あたえてchkconfig -add して終了。

Railsアプリをやる場合はポートごとに stop を工夫する必要があるけど lsof とか使ってスクリプト書けばおk

起動スクリプトの書き方