2017-04-21 3 views
-2

IO.popen 호출이 포함 된 Ruby 스크립트가 있습니다. Ctrl + C를 사용하여 popen 호출을 취소 할 수 있습니다 (Signal.trap("SIGINT")을 사용하고 kill -2 #{popen_pid}을 호출합니다). 이 잘 작동하고 CTRL + C를 누르면 kill -2 자체를 종료하기 전에 popen 프로세스가 일부 정리를 실행합니다.Ruby에서 Ctrl + C를 에뮬레이트하는 방법은 무엇입니까?

내 문제 : popen 프로세스가 너무 오래 걸리는 경우에도 이와 동일한 문제가 발생할 수 있습니다. 그러나 CTRL + C 동작을 에뮬레이트 할 수 없습니다. 루비 스크립트의 pid에 Process.kill을 사용하면 정리 작업없이 모든 작업이 끝나고 popen 프로세스에서 Process.kill을 실행해도 아무 효과가 없습니다. 루비 스크립트의 pid와 popen pid에 kill -2을 호출하기 위해 백틱을 사용하여 쉘에 직접 액세스를 시도했지만 아무 것도하지 않습니다.

아무도 제안 사항이 있습니까?

답변

0

나는 그들이 일어나고 있었다 나는이는 popen 과정에서 라인을 인쇄하고 싶었 주로하기 때문에 문제로 실행뿐만 아니라 kill -2 프로세스 정리를 장려 할 것입니다 시간 제한을 가지는 것을 밝혀졌습니다. 결국

, 내가는 popen 전화와 함께 새 스레드를 시작하기까지 끝난는 popen 호출 내 대기 시간보다 더 오래 걸렸다하면 스레드가 kill -2를 부를 것이다 (하지만이 명령에서 물건 인쇄를 시작하기 전에) :

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

특히 셸에 액세스 할 때 프로세스를 죽이는 것에 대한 대답을 얻기가 어려울 수도 있습니다. 한 플랫폼의 솔루션이 다른 플랫폼에서 작동하지 않을 수도 있습니다. 프로세스를 죽이는 번거 로움을 겪으려는 것보다 Timeout을 사용하는 것이 좋습니다. 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