Ruby等待来自外部进程的信号

时间:2014-01-28 17:42:06

标签: ruby

有没有办法让Ruby进程/线程暂停,直到某些外部进程的信号(或其他进程间通信机制)恢复为止?我尝试了以下内容,但线程似乎没有醒来:

this_thread = Thread.current
Thread.new do
  Signal.trap("INT") do
    puts "\nWaking up!"
    this_thread.run
  end
  sleep
end

puts "Going to sleep..."
Thread.stop
puts "Now awake! =)"

示例运行:

$ ruby wake_on_signal.rb 
Going to sleep...
^C
Waking up!
^C
Waking up!
^C
Waking up!

我也尝试过以下方法,它可以运行,但依赖于不断检查某些变量的值,如果可能的话我宁愿避免这样做:

signal_received = false
Signal.trap("INT") do
  puts "\nWaking up!"
  signal_received = true
end

puts "Going to sleep..."
sleep 0.5 until signal_received
puts "Now awake! =)"

示例运行:

$ ruby sleep_until_signal.rb 
Going to sleep...
^C
Waking up!
Now awake! =)

2 个答案:

答案 0 :(得分:1)

这已经晚了三年,但对未来的读者可能会有所帮助:

puts "kill -#{Signal.list["USR1"]} #{Process.pid}"
thr = Thread.new do
    this_thread = Thread.current
  Signal.trap("USR1") do
    puts "\nWaking up!"
    this_thread.kill
  end
  sleep
end

puts "Going to sleep..."
thr.join
puts "Now awake! =)"

这将暂停主线程并等待USR1信号。它打印出可用于唤醒线程的命令。在我的系统上,打印

$ ruby signal_handler.rb
kill -30 66771  
Going to sleep...

Waking up!
Now awake! =)

答案 1 :(得分:0)

您可以使用at_exit执行此操作:

at_exit do
  puts "Now awake! =)"
end

Signal.trap("INT") do
  puts "\nWaking up!"
  exit
end

puts "Going to sleep..."
sleep

示例运行:

$ ruby wake_on_signal.rb 
Going to sleep...
^C
Waking up!
Now awake! =)