我有一个ruby程序,产生了新的进程。即使我按Ctrl-C,我希望这些能够在父母身上存活下来。为了实现这一点,我尝试捕获INT,但是,这没有用。
下面的程序在每次按Enter时启动xeyes,如果你写任何东西则退出,如果按Ctrl-C然后返回则应该退出。
我可以做些什么来保持我的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。
答案 0 :(得分:0)
只有父进程被SIGINT
杀死,子进程正在死亡,因为他们正在发送一个SIGHUP
信号,表明他们的父进程已经死亡。尝试通过nohup
命令启动xeyes。它将阻止SIGHUP
信号杀死它启动的进程。
Thread.new { system("nohup xeyes") }