5
Thorを使用してARGV
を管理するレーキタスクのように実行するスクリプトがあります。ルビーの中のすべてのプロセスを殺すにはどうすればいいですか?
#!/usr/bin/env ruby
require "thor"
class Run < Thor
desc "start", "start script"
def start
p1 = fork{ loop... }
p2 = fork{ loop... }
# 3 processes running
Process.detach(p1)
Process.waitpid(p1)
end
desc "stop", "stop script"
def stop
# kill all 3 pids
end
end
Run.start
ruby script.rb start
を起動すると、2つのサブプロセス(計3)を生成します。私の質問は、ruby script.rb stop
を実行するとすべてのプロセスを強制終了する方法です。私はWeb上で、pidの親プロセスをファイルに保存し、停止したらそれを読んで殺すべきであることを見てきました。問題は、親を殺しても子供を殺さないということです。だから私はファイルに3つのPIDをすべて保存し、後で1つずつ削除することができます。
これを行う正しい方法と、start
内のプロセスを使用して作業している方法が正しいかどうかを確認しています。
はデーモン化サービスのかなり一般的な方法のようです、あなたのケースではそれはありませんファイルシステムにすべてのPIDを格納するようなサウンドは意味がありますが、これは正しいプロセスを強制終了する最も確実な方法です。 –
あなたの答えをありがとう! – Luccas
可能な代替手段は、オブジェクトがGC後に適切にクリーンアップするときにファイナライザを付けることです。 http://stackoverflow.com/questions/5956067/ruby-destructorsデーモンの宝石を使ってプロセスを管理することもできます。 http://daemons.rubyforge.org/ –