RaspberryPi 気に入って使ってます。Debianを入れてます。raspbian ですね。
RaspberryPiがupstart未導入だったのでruby でinitスクリプト作った
daemonsがお手軽
gem install daemons
Process.daemonizeがある昨今においてdaemonsパッケージは不要かと思ってたけれど、まだまだ使える。
start/stop/resutart/run をすぐに作れる
daemonsパッケージ使うと、initスクリプトに必要なコマンド引数をすぐに作ってくれる。
Daemons.run_proc に Procを渡すだけ
require "daemons" Daemons.run_proc("my_first_proc_daemon", options ){ begin server = Thread.new{ :job_server } woker = Thread.new { :job_worker } server.start server.join rescue #retry end }
起動終了
./my_job_queue start ./my_job_queue stop ./my_job_queue status ./my_job_queue run # foreground に stay on topする
RaspberryPi の init.d daemon にする
:dir_mode => :system を渡して、 /var/run に pidファイルを作成するようにする。
あとは、このファイルを /etc/init.d にコピーして、適当なRunlevelを貼り付ければOK
適当なランレベル
runlevel を貼るには、 /etc/init.d においたスクリプトを /etc/rc{0-5}.d/にエイリアスすればいい。数値は起動順序。
面倒なときは、rcconf でパパっと。
出来上がったinit.dスクリプト
#!/usr/bin/env ruby ### BEGIN INIT INFO # Provides: my_server # Required-Start: $all # Required-Stop: $all # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: my_server # Description: my_server ### END INIT INFO require 'daemons' options ={ :dir_mode => :system, ##/var/runに :backtrace => true, :monitor =>true, :log_dir => "/var/log/my_server", :log_output => true, } Daemons.run_proc("smtp_proxy_server", options ){ server = Thread.new{ loop {sleep 1;print :awake;} } server.pass server.join }
プロセス監視する:monitor
また、:monitor=>trueにすると、プロセスがErrorで死んだ時に再起動を自動で行ってくれて更に便利。
options ={ :monitor=>true, ##以下略 }
monitorも便利です。
monitorが無事起動すると、プロセスがひとつ増える。
takuya@raspberrypi:~$ ps auxf | grep smtp root 2655 0.0 1.8 17684 9052 ? Sl 04:51 0:06 smtp_proxy_server_monitor root 2662 0.0 1.3 13880 6760 ? Sl 04:51 0:04 smtp_proxy_server
smtp forwarder を ruby で作って起動し監視しています。
INIT INFO については
INITスクリプトは LSB (Linux Standard base ) で「こう書け」が指定されているのでそん通りに。
### BEGIN INIT INFO # Provides: my_server # Required-Start: $all # Required-Stop: $all # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: my_server # Description: my_server ### END INIT INFO
大事なのは Required-Start で、ここを$all以外 にすると、ネットワークやファイルシステムが起動時点で起動するとか色々決められる。いまは $all なので全部の起動処理後にスクリプトをDaemonizeしてる。
https://wiki.debian.org/LSBInitScripts
upstart があれば。。。
upstart がアレばもっと楽に書けるんだけど、自分で起動終了を管理したいこともあるってことと、 raspberryPiのDebianにUpStart入ってないからです。 apt-getでインストール出来るんだけど、入れたら何か突然誤作動したら怖いので。