daemonsで遊ぶ
|
環境はCentOS(Linux)
・ruby ・gem ・daemons で実験
daemonとはターミナルを切ってもバックグラウンドで処理をし続けることです.
「&」をつけてプログラムを起動させることはデーモンとは違います.
でまぁ,デーモン自体難しいかと思ってたんですが,
Rubyプログラムを間単にデーモン起動することが出来るgemがありました. それが daemons です.
test.rb
loop do
helooと表示して5秒間休憩することを繰り返すプログラムp 'hello' sleep(5) end 試しに,これを実行すると
# ruby test.rb
と表示されます.終了方法はCtr+C"hello" "hello" "hello" (省略)
次にデーモンとしてコントロールするプログラム
test_cont.rb(名前はなんでもいい)
require 'rubygems'
でデーモン起動できます.require 'daemons' Daemons.run('test.rb')
確認方法
ps axuCOMMANDの欄にtest.rbがあればバックグラウンドで起動できてます.PIDとかの説明は [http://www.ie.u-ryukyu.ac.jp/viewvc/y04/j04057/OS_2006/Process/kadai3.txt?revision=1.1 ]を参照
今回test.rbがhelloと表示するだけのプログラムだったので,デーモンの意味はありませんでしたが,
1時間置きにデータを更新するとか,1つの端末で複数のプログラムを同時に走らせるとか…
あんまりいい例が思いつかないけど,便利なはず!
その他・「ruby test_cont.rb stop」でとまらない場合(PID=10000のとき)kill -SIGKILL 10000でとめる.他のプロセスを止めないように気をつける.・rootユーザで起動した場合は,同じ権限を持ってないと止められない ・windowでうまくいくかはわからない(VMware + CentOSとかで実験?) ・必ずsleepかなにかで休憩させる(必ずかはわからんけど) ・レンタルサーバの場合はデーモン可かどうか調べる ・できるだけ自分の環境で試す
追加で必要なもの
gcc ←Cプログラムをコンパイルする
大まかな流れ
test2_cont.rb test2.rb test2.c test2 の4つのファイルを作る test2.cからtest2という実行ファイルを作る test2.rbからtest2を呼び出す test2_cont.rbでtest2.rbをデーモン起動する
test2.c
#include <stdio.h>
これも,5秒おきにhelloと表示するプログラムですmain(){ while(1){ printf("hello\n"); sleep(5); } } sleep関数はLinuxだけかな?
test2.rb
exec("./test2")
test2を実行する方法は2種類です・system('./test2') ・exec("./test2" ) 今回はexecをつかいました.
test2_cont.rb
require 'rubygems'
require 'daemons' Daemons.run('test2.rb')
ps axuで確認しましたがプロセスは作られてませんでした.
どうやればいいのかな(〜.〜)
参考ページデーモンプロセスの起動について - 教えて!gooデーモンモードとは何でしょうか? - OKWave [http://www.ie.u-ryukyu.ac.jp/viewvc/y04/j04057/OS_2006/Process/kadai3.txt?revision=1.1 ] 【プログラミング/Ruby】Windows環境上(Win2000)で、Rubyから実行ファイル(exe形式)に引数を渡して呼び出すにはどうすれば良いでしょうか。できれば簡単なサンプルを付して教えて下さい。お願いします。
方法
1.Cプログラムを書く 2.コンパイルして実行ファイルを作る 3.pathの通っているところに実行ファイルを置く 4.Cを呼び出すrubyファイルを作る 5.デーモン用のrubyファイルを作る
test3.c
#include <stdio.h>
main(){ while(1){ printf("hello\n"); sleep(5); } }
test3.rb
exec("test3")
test3_cont.rb
require 'rubygems'
require 'daemons' Daemons.run('test3.rb')
3.pathの通っているところに実行ファイルを置く
まずパスの通っているところを調べる. echo $PATHで調べるusr/binにあった場合 usr/binにtest3.cをコンパイルしたtest3を置く パス(PATH)の確認と設定方法は? Pocketstudio.jp Linux Wikiでパスについて参考
あとは
ruby test3_cont.rb start で実行
ps axu
でプロセスを確認すると test3.rb test3 の2つ作られる
ruby test3_cont.rb stop
で停止するとtest3.rbしか止まらないので,PIDを調べて(pid=111111111のとき) kill -SIGKILL 111111111 で止める
わかったこと
system()は使えるので, 同じ要領でsqliteで編集したり,システムコマンドのmkdirでファイルを作ったりできること |