2017-05-30 24 views
1

次のコードは、メインプロセスをフォークし、バックティックでコマンドを実行します。スクリプトの最後のkillは、フォークされたプロセスのみを強制終了しますが、それは子プロセスではありません(つまり、sleepコマンド)。子プロセスを持つRubyでフォークプロセスを強制終了する

pid = fork do 
    Thread.new do 
    `sleep 20` 
    end 
end 
sleep(1) 
Process.kill("HUP",pid) 

プロセスツリーを検索以外の(フォークプロセス内のスレッドでバッククオートコマンドによって生成された)すべての子プロセスを殺すために方法はありますか?シーンの背後

答えて

2

双方システムとバッククォート操作が 現在のプロセスをフォークするためにフォークを使用し、それらは EXECを使用して、指定された動作を実行します。

execが現在のプロセスを置き換えるため、 の操作が成功すると何も返されません。操作が失敗すると、 `SystemCallErrorが発生します。

http://blog.bigbinary.com/2012/10/18/backtick-system-exec-in-ruby.html

+0

ですから、答えは「いいえ」です。プロセスツリーを検索する必要があります – jhj

0

あなたはすぐに、プロセスのPIDを取得するために

pid = Process.spawn('sleep 20') 

を使用することができます。上記のあなたのコードは次のように変更されます:

pid = Process.spawn('sleep 20') 
sleep(1) 
Process.kill('HUP',pid) 
関連する問題