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

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

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

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

«Процесс setsid», кажется, гарантирует, что нет управляющего терминала, и я подозреваю, что это центральное. Однако мне не удается заставить jruby принять вилку, даже используя флаг -J-Djruby.fork.enabled=true.


person JenEriC    schedule 07.04.2011    source источник


Ответы (1)


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

Thread.new { system("nohup xeyes") }
person Rakis    schedule 07.04.2011
comment
Нет, это было не так. добавил nohup, получил такое же поведение.. :-( - person JenEriC; 07.04.2011