如何阻止Ctrl-C使用jruby杀死生成的进程?

时间:2011-04-07 08:22:40

标签: linux exception-handling jruby sigint

我有一个ruby程序,产生了新的进程。即使我按Ctrl-C,我希望这些能够在父母身上存活下来。为了实现这一点,我尝试捕获INT,但是,这没有用。

下面的程序在每次按Enter时启动xeyes,如果你写任何东西则退出,如果按Ctrl-C然后返回则应该退出。

  • 如果我以正常的方式退出,xeyes就会幸免于难。
  • 如果按Ctrl-C,则xeyes会死。
  • 跟踪xeyes,它会收到一个SIGINT,而不是建议的SIGHUP。

我可以做些什么来保持我的xeyes活着?

该计划:

#!/usr/bin/jruby
require 'readline'

keep_at_it = true

trap("INT") { puts "\nCtrl-C!" ; keep_at_it = false }

while (keep_at_it) do
  line = Readline.readline("Enter for new xeyes, anything else to quit: ", true)
  if (line.length == 0 && keep_at_it == true)
    Thread.new { system("nohup xeyes >/dev/null 2>/dev/null") }
  else
    keep_at_it = false
  end
end

我也一直在使用ruby进行测试,但由于我需要只有jruby支持的JMX支持,所以我不能使用ruby。以下方式适用于ruby:

fork { Process.setsid; exec("xeyes") }

'进程setsid'似乎确保没有控制终端,我怀疑这是核心。但是,即使使用-J-Djruby.fork.enabled = true标志,我也无法获得jruby接受fork。

1 个答案:

答案 0 :(得分:0)

只有父进程被SIGINT杀死,子进程正在死亡,因为他们正在发送一个SIGHUP信号,表明他们的父进程已经死亡。尝试通过nohup命令启动xeyes。它将阻止SIGHUP信号杀死它启动的进程。

Thread.new { system("nohup xeyes") }