それマグで!

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

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

gem server をRubyのソースコードから起動してdaemon化パッケージに任せる

Rubyのgem server は手軽にドキュメントを引けるので重宝しています.このサーバーは手軽に作れるしそこそこページ数あるのでRubyで外部HTML取得するスパイダを書いているときにテストサーバーとして重宝します.

Test::Unitでテスト用のサイトが欲しいのでgem server を活用する.


Gem Server を一時的に起動して、テストのなかでOpen-URIする対象にすればNokogiriやMechanizeを組み込んだクラスの動作チェックに使えそうです.
gem server をrubyソースコード中で使えると嬉しい.テストWEBサーバーとして活用できる

テストコード中でGemServerを起動して終了する

ruby の gem server をRubyスクリプト中で起動したい.でもってopen-uriをするプログラム
の実験台になって貰い、テストコードで活用する.

gem server をスクリプトから起動するには、gem ファイルを見てみると、大体分かる。最低限以下があれば十分らしい

require 'rubygems'
require 'rubygems/gem_runner'
require 'rubygems/exceptions'
args = ["server","--bind=localhost","--port=10080","--no-daemon"]
Gem::GemRunner.new.run args

テストで活用する

def setup
  require 'rubygems'
  require 'rubygems/gem_runner'
  require 'rubygems/exceptions'
  args = ["server","--bind=localhost","--port=10080","--no-daemon"]
  Gem::GemRunner.new.run args
end
def test_something_like_spidering
  require 'open-uri'
  open("localhsot:10080"){|f| 
     #do something for parsing
  }  
end

こんな感じでmechanizeの実験台にちょうど良いかもね.

Gem Serverをdaemons で常時起動する

ここまで出来れば、ついでに gem server をデーモンにする方法も考えておく
gem_server を起動時に実行したいので,Daemon化しておくとか。単体でもDaemonになるんだけど、そこはご愛敬、Daemonsを試したかった.

gem_server.rb
#!/usr/bin/env ruby
require 'rubygems'
require 'rubygems/gem_runner'
require 'rubygems/exceptions'
require 'daemons'
Daemons.run_proc('gem_server',{:log_output=> STDOUT})  do
  args = ["server","--bind=localhost","--port=10080","--no-daemon"]
  begin
    Gem::GemRunner.new.run args
  rescue Gem::SystemExitException => e
    exit e.exit_code
  end
end

あえて --no-daemonをつかって daemon化の処理をDaemonsパッケージに任せている。
どんなスクリプトでもdaemon化できるruby daemonsパッケージは偉大です.

daemonsでデーモンにすると管理が楽

gem_server.rb start #起動
gem_server.rb stop  #停止
gem_server.rb restart #再起動

daemonsパッケージはrubygemsで提供されている

gem install daemons

ruby1.9以降は Proccess.daemonが出来たのでそっちを使ってもいよ
でももっぱら god がオススメ.

ログを見たいときは daemons パッケージの使い方に従うといい

Daemons.run_proc('gem_server',{:log_output=> STDOUT})  do

STDOUT を指定すると gem_server.log が、実行ディレクトリに出来る.
そのほかはSyslogとかいろいろと組み合わせて使うと良い.

一つだけ注意

Daemonパッケージはpid ファイルをつかってプロセス番号を覚えておく
もちろんpid が重要なのです.pidファイルは設定するべき.
設定を省略するとカレントディレクトリの中に作られるので
実行ディレクトリが変わるとstop できなくなる

takuya@/home/takuya/ $./test_server start #開始
takuya@/home/takuya/ $./test_server stop  #停止できる
takuya@/home/takuya/sample $../test_server stop  #停止できない