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 [email protected] 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