Если вы используете любую * nix ОС, ваш процесс получит SIGCHLD при выходе из подпроцесса. В зависимости от того, имеется ли у вас более одного подпроцесса за раз, его можно использовать для определения его завершения.
Кроме того, каналы ввода-вывода для подпроцесса реализованы под колпаком с трубами, поэтому вы обязательно получите EOF в конце вывода и, возможно, SIGPIPE, когда он тоже выключится.
В Ruby установка обработчика сигнала выполняется просто:
Signal.trap("CHLD") do
Process.wait
$child_died = true
end