2017-04-21 3 views
-2

IO.popen呼び出しを含むRubyスクリプトがあります。私はCTRL + C(私はkill -2 #{popen_pid}を呼び出す私につながるSignal.trap("SIGINT")を使用して)とpopenコールをキャンセルすることができます。これはうまく動作し、CTRL + Cを押すと、kill -2はpopenプロセスが何らかのクリーンアップを実行して終了します。RubyでCtrl + Cをエミュレートするには?

私の問題:私は、popenプロセスが時間がかかりすぎると、同じような動作をしたいと思っています。ただし、CTRL + Cの動作をエミュレートすることはできません。 rubyスクリプトのpidにProcess.killを使用すると、クリーンアップが行われずにすべてが終了し、popenプロセスでProcess.killを実行すると何も起こりません。私は直接ルックアップスクリプトを使ってシェルにアクセスしようとしましたが、rubyスクリプトのpidとpopenのpidにkill -2を呼び出してみましたが、どちらもしません。

誰か提案はありますか?

答えて

0

私は、彼らが起こったとして、私はpopenのプロセスからのラインを印刷したかった主な理由の問題に実行している、だけでなく、プロセスのクリーンアップを奨励するためにkill -2をするでしょうタイムアウトを持っていたことが判明しました。 popenの呼び出しが長い私の待機時間よりもかかったらスレッドがkill -2を呼ぶだろう最後に

、私はpopenの呼び出しと一緒に新しいスレッドを開始することになった(しかし、私は、コマンドからのものを印刷開始前)、:

Thread.new do 
    $next_thread += 1 
    this_thread = $next_thread - 1 
    $active_threads[this_thread] = true 
    start_time = Time.now 
    while true 
    break if not $active_threads[this_thread] 
    minutes_elapsed = (Time.now - start_time)/60 
    if minutes_elapsed > 90 
     inner_packer_pid = `ps -Af | tr -s ' ' | grep -v "grep" | grep "packer build" | cut -d' ' -f2 | sort | tail -n 1`.strip() 
     `kill -2 #{inner_packer_pid}` 
     cancel_build() 
     break 
    end 
    end 
    $active_threads[this_thread] = false 
end 

builders = Set.new 

packer_build = IO.popen("packer build -color=#{not $is_no_color} #{spec_file} 2>&1") 
$packer_build_pid = packer_build.pid 
packer_build.each do |line| 
    puts line 
end 
0

特にシェルにアクセスするときにプロセスを強制終了することについての回答を得るのは難しいかもしれません。あるプラットフォームのソリューションは、他のプラットフォームでは動作しない可能性があります。あなたのプロセスを強制終了するという面倒を見送るのではなく、あなたのIO.popen呼び出しがあなたの望む時間よりも長くかかる場合は、タイムアウトを使うことをお勧めします。レスキューではクリーンアップを実行できます。

require 'timeout' 

seconds_to_wait = 10 


begin 
    block_result = Timeout.timeout(seconds_to_wait) do 
    # your IO stuff 
    end 
rescue Timeout::Error 
    puts "Ain't nobody got time for that!" 
    # do your clean up here 
end 
+0

これはpopen呼び出しを停止する際に機能しますが、基本的に-9シグナルで呼び出します。プロセスが内部クリーンアップを実行する必要があるため、-2が必要です... – ldanielw1

関連する問題