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

我有一个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进行testing,但由于我需要JMX支持,只有在jruby中可用,所以我现在不能使用ruby。 下面的方式在Ruby中工作:

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

'stream程setsid'似乎确保没有控制terminal,我怀疑这是中央。 但是,我不能让jruby接受fork,即使使用-J-Djruby.fork.enabled = true标志。

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

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