WebサーバーでいくつかのRoRWebサイトを実行しており、起動時にRubyスクリプトを実行する必要があります。
そこで、bashスクリプトを/etc/init.d witch call a Ruby processに入れました。残念ながら、Ruby processにはロードされていないものが必要ですまだ。
Bashスクリプトの先頭にsleep 300
を追加しようとしましたが、ssh、Apacheなどの起動にも影響するため、実際には役に立ちません。
また、起動時にすべてのRubyライブラリをロードすると、起動時間が遅くなるため、ロードしたくありません。
sleep 300
は進むべき道ですが、非同期と呼ぶ関数に入れる必要があります。
myscript()
{
sleep 300
# do what you want
}
myscript &
# continue with other things
5分間寝ることは、かなり不安定なハックです。ブートチェーンの後半で起動に異常な長い時間がかかる場合はどうなりますか?また、システムの起動に必要以上に時間がかかるのはなぜですか?
それを行う正しい方法は、スタートアップスクリプトを実行させることですafter依存するもの。これを行う方法は、ディストリビューションによって異なります。
Debianでは、スクリプトヘッダーでスクリプトの依存関係を指定します。 DebianWheezyの/etc/init.d/README
の例を次に示します。
# Required-Start: $remote_fs $syslog
他のシステムでは通常、/etc/rc?.d/
フォルダーの1つにあるファイル名のどこかに番号を付けてスクリプトに名前を付けます。このようなディストリビューションでは、依存しているものよりも大きい数を指定してください。
別のスレッドを開始して、スレッドが最初に行うのはスリープ300です。次に、init.dから呼び出したスクリプトを呼び出します。
それは次のようなものになると思います
newscript &
ファイルの作成:delay
#!/bin/bash
# $1:delay time(s)
# $2:command
# example:
# delay 10 "conky -d"
sleep $1
exec $2
その後
chmod a+x delay
delay 10 "xxx"
中に入れて /etc/rc.local