, чтобы правильно остановить порожденное дерево процессов (а не только родительский процесс), нужно подумать о чем-то вроде этого:
def exec_with_timeout(cmd, timeout)
pid = Process.spawn(cmd, {[:err,:out] => :close, :pgroup => true})
begin
Timeout.timeout(timeout) do
Process.waitpid(pid, 0)
$?.exitstatus == 0
end
rescue Timeout::Error
Process.kill(15, -Process.getpgid(pid))
false
end
end
это также позволяет отслеживать статус процесса