Как мне остановить Ctrl-C от уничтожения порожденных процессов с помощью jruby? - PullRequest
3 голосов
/ 07 апреля 2011

У меня есть программа ruby, порождающая новые процессы.Я хочу, чтобы они пережили своего родителя, даже когда я нажимаю Ctrl-C.Для этого я пытаюсь перехватить INT, однако это не помогает.

Программа ниже запускает xeyes каждый раз, когда вы нажимаете ввод, завершает работу, если вы что-либо пишете, и должна завершать работу, если вы нажимаетеCtrl-C, а затем вернуться.

  • Если я выйду обычным способом, кси выживут.
  • Если я нажму Ctrl-C, кси умрет.SIGINT, а не SIGHUP, как было предложено.

Что я могу сделать, чтобы мои кси-хэны были живы?

Программа:

#!/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, но так как мне нужна поддержка JMX, которая доступна только с jruby, я не могу использовать ruby ​​как есть.В ruby ​​работает следующий способ:

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

Кажется, что 'Settsid процесса' обеспечивает отсутствие управляющего терминала, и я подозреваю, что он является центральным.Однако мне не удается заставить jruby принять fork, даже используя флаг -J-Djruby.fork.enabled = true.

1 Ответ

0 голосов
/ 07 апреля 2011

SIGINT уничтожает только родительский процесс, дочерние процессы умирают, потому что им отправляется сигнал SIGHUP, который указывает, что их родительский процесс умер. Попробуйте запустить xeyes с помощью команды nohup. Это предотвратит сигнал SIGHUP от запуска процессов, которые он запускает.

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