それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

rubyでinit.d スクリプトを作った。

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のDebianUpStart入ってないからです。 apt-getでインストール出来るんだけど、入れたら何か突然誤作動したら怖いので。

参考資料

http://rubydoc.info/gems/daemons/1.1.9/frames