In message <3C8EC1FE6E.15EA.BXQ04723 / nifty.ne.jp>
BXQ04723 / nifty.ne.jp writes:

> > > ruby --kamikaze 300  5分で自爆する等で、その間デットロックしたら
> > > 自ら時限装置
> >   Ruby 側でそういう機能を持つよりも、別にツールを用意して
> >   kamikaze -t 300s ruby ...
> 
> それって、rubyからkamikazeへ、情報を伝える手段が必要ですよね。

いらないんじゃ.まじめにプロセス内情報を利用するのならともかく.


> で、そこまでやる(できる)んならば、「デッドロック(?)してるかどーかを
> 調べる」手間に比べればほんのわずかの手間で、rubyのプロセス:-Pを
> 落せるんですよねえ?
> じゃあ「調べる」だけを内部(thread?)でやって「落す」を外部プロセスに頼る
> よりも、「落す」ところまで自分(ruby(のライブラリ)の中)でやっちゃえば
> いいのではないか、と思いました。

単にサブプロセスとして実行して,時間内に終わらなかったら kill でいいの
だったら ruby 専用にする必要などないのでは,という話でしょう.

    #!/usr/bin/env ruby
    
    timeout = ARGV.shift.to_i
    
    child = Process.fork do
      exec *ARGV
    end
    trap("SIGCHLD") { Process.waitpid(child, 0); exit }
    
    sleep timeout
    
    if Process.waitpid(child, Process::WNOHANG).nil?
      Process.kill("SIGHUP", child)
    end

っていう程度? あらゆる場合にちゃんと動くとはいいませんが.きっともっと
ちゃんとしたものがどこかに有る :-)

# WNOHANG な waitpid が待つ相手が動いてる時には nil を返すっていうのは
# 正しいですよね?

# そうか,waitpid() は -1 返して EWOULDBLOCK じゃないのか....


-- 
柳川和久 @ 東大阪市 . 大阪府                                 March 13, 2002
「やっぱりお化けもどろぼうも姪もいない環境でないと落ちついてにせ札もすれないな」