[#46647] RubyでWindowsの常駐サービスプログラムを作る方法 — kouichi_someya@...

はじめまして。

12 messages 2009/12/16
[#46649] Re: RubyでWindowsの常駐サービスプログラムを作る方法 — "U.Nakamura" <usa@...> 2009/12/17

こんにちは、なかむら(う)です。

[ruby-list:46674] 子プロセスを kill する方法は?

From: "Hideo Konami" <konami@...>
Date: 2009-12-21 02:38:29 UTC
List: ruby-list #46674
小波です。

下に掲載してあるように,メインの Ruby プログラムから,他の Ruby のソ
ースファイルを実行する実験を行っています。期待しているのは,万一
呼び出されたプログラムが無限ループに陥った場合には,実行を打ち切って
プロセスを kill してくれることです。

そこで, loop1.rb 中の i += 1 を削除して main.rb を走らせてみると,
たしかに "Time over!" が出力されて,期待通りになっているかのように
見えます。

> ./main.rb 
Time over!

ところが,この時点で loop1.rb の実行は続いているらしく,ps で次のよう
なレポートが得られます。

~/Programming/Ruby/thread/11:25:33> ps aux |grep ruby
myuserid  1738  100.0  0.1    76576   1388 s001  R    11:25AM   0:03.84 /usr/local/bin/ruby -- -
myuserid  1740   0.0  0.0   600256      0 s001  R+   11:25AM   0:00.00 grep ruby
 
つまり,実行しているプロセスは join(timelimit) で止められないし,
kill メソッドも働いていないということです。外部のプロセスになって
しまっているので,制御は出来ないということなのでしょうか。そこの
考え方を納得したいのです。

また,このソースでやりたいこと,つまり他のプログラムを実行して,
もしも無限ループに落ちたとしたら,実行を中断してしまうやりかた
として,何があるでしょうか。よろしくお願いします。


------------------- main.rb -------------------
#! /usr/local/bin/ruby -Ku
time_limit = 1
sa = []
File.open("loop1.rb") do |fp|
  fp.each_line do |line|
    sa << line.chop
  end
end
result = ""
source = sa.join(";")
t = Thread.new{
  io= IO.popen("/usr/local/bin/ruby --  - \n","r+")
  io.write(source)
  io.close_write
  result = io.read
  io.close_read
}
if t.join(time_limit) 
  puts "result = '#{result.chomp}'"
else
  puts "Time over!"
  t.kill
end
-------------------------------------------------

------------------ loop1.rb ---------------------
i = 0
sum = 0
while i < 10
  sum += i
  i += 1
end
puts sum
--------------------------------------------------





In This Thread

Prev Next