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

はじめまして。

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

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

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

From: "Hideo Konami" <konami@...>
Date: 2009-12-22 04:26:56 UTC
List: ruby-list #46688
小波です。

--- "Tanaka Akira" <akr@fsij.org> ---
>> ・親プログラムから子のプログラムを実行する
>> ・子のプログラムからの標準出力を,親は文字列として受け取る
>> ・子のプログラムの実行がある時間を超えたら停止させる
>
>IO.popen で起動して、
>IO.select の第4引数で timeout を指定しつつ待って、データが来たら読み込んで、
>時間がオーバーしたら IO#pid で得た pid で kill ですかね。

実験してみたところ,次のソースでうまくいっています。子プロセスが無限
ループに落ちると time_limit を見てスレッドを kill し,同時にプロセス
の pid を使って kill -HUP pid で落とせるようです。考えてみればあたり
前のことですが,思いついていませんでした。どうもありがとうございました。


#! /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
pid = 0
result = ""
source = sa.join("\n")

io = ""
t = Thread.new{
  io= IO.popen("/usr/local/bin/ruby --  - \n","r+")
  pid = io.pid
  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
  system "kill -HUP #{pid}"
end







In This Thread