2011-04-07 71 views
3

我有一個紅寶石程序,產生新的進程。即使按Ctrl-C,我也希望這些能夠在父母身上生存下來。爲了做到這一點,我試圖陷入INT,但是,這並沒有幫助。如何阻止Ctrl-C使用jruby殺死衍生進程?

下面的程序在你每次按下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支持,多數民衆贊成,因爲,是我不能使用紅寶石。下面的方式工作在紅寶石:

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

'進程setsid'似乎確保沒有控制終端,我懷疑這是中央。但是,我無法讓jruby接受fork,即使使用-J-Djruby.fork.enabled = true標誌。

回答

0

只有父進程被SIGINT殺死,子進程正在死亡,因爲它們正在發送一個SIGHUP信號,指示其父進程已經死亡。嘗試通過nohup命令啓動xeyes。它會阻止SIGHUP信號殺死它啓動的進程。

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

不,那不是。 nohup補充說,得到了同樣的行爲.. :-( – JenEriC 2011-04-07 14:44:10