Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby等待来自外部进程的信号_Ruby - Fatal编程技术网

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

Ruby等待来自外部进程的信号,ruby,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 aw

有没有办法让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! $ ruby sleep_until_signal.rb Going to sleep... ^C Waking up! Now awake! =) $ ruby wake_on_signal.rb Going to sleep... ^C Waking up! Now awake! =) 运行示例:

$ ruby wake_on_signal.rb Going to sleep... ^C Waking up! ^C Waking up! ^C Waking up! $ ruby sleep_until_signal.rb Going to sleep... ^C Waking up! Now awake! =) $ ruby wake_on_signal.rb Going to sleep... ^C Waking up! Now awake! =) $ruby sleep\u until\u signal.rb 要睡觉了。。。 ^C 醒醒! 现在醒来!=)
您可以使用退出时的
来执行此操作:

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! ^C Waking up! ^C Waking up! $ ruby sleep_until_signal.rb Going to sleep... ^C Waking up! Now awake! =) $ ruby wake_on_signal.rb Going to sleep... ^C Waking up! Now awake! =) $ruby wake_on_signal.rb 要睡觉了。。。 ^C 醒醒! 现在醒来!=)
这大约晚了三年,但可能对未来的读者有所帮助:

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! =)

哈哈。很好的尝试,但我真的需要程序在唤醒后继续运行P在收到信号后,我的真实程序需要做的事情远不止打印“Now awake!=)”然后退出。你可以把所有这些都放到一个方法中,然后在退出时调用它但是我明白你的意思了——能够停下来并重新开始几次会很好。