Извините, что у меня нет ответа на вашу более крупную проблему отправки сигнала через X секунд процессу, но кажется, что все, что вам нужно сделать, - это тайм-аут после X секунд ожидания ввода, и в таком случае я бы сказал, что вы ищете Kernel.select: D
Лично я никогда не использовал это, но после того, как я сделал для Google «неблокирующее получение» и впоследствии изучил ссылки, я обнаружил, что эти два вопроса являются бесценными:
http://www.ruby -forum.com / topic / 126795 (Обсуждение многопоточного получения)
http://www.ruby -forum.com / topic / 121404 (Объяснение Kernel.select во 2-м посте)
Вот пример того, как его использовать. Это распечатает ваше приглашение и будет ждать ввода ... Если через пять секунд ввода не будет, программа завершится. Если есть ввод, то как только он будет введен, он выплюнет его обратно и завершит ... Очевидно, вы можете изменить это для своих собственных целей.
def prompt
STDOUT.write "> "
STDOUT.flush
end
def amusing_messages
[ "You must enter something!",
"Why did you even start me if you just wanted to stare at me?",
"Isn't there anything better you could be doing?",
"Just terminate me already... this is getting old",
"I'm waiting..."]
end
prompt
loop do
read_array, write_array, error_array = Kernel.select [STDIN], nil, nil, 5
if read_array.nil?
puts amusing_messages[rand(amusing_messages.length)]
else
puts "Result is: #{read_array[0].read_nonblock(30)}"
end
prompt
end
Это, вероятно, не так элегантно, как хотелось бы, но оно определенно справляется со своей работой, не шутя с нитями. К сожалению, это не поможет вам, если вы хотите что-то более надежное (таймер / отправка сигнала процессу), и, к сожалению, я понятия не имею, работает ли это в JRuby. Хотелось бы знать, если это так:)