Есть ли простой и надежный способ узнать, когда задача IPC::Run
выполнена, то есть все дочерние процессы (ы) вышли?Как узнать, закончилось ли задание IPC :: Run
Документы удивительно молчат об этом.
Кажется, что зацикливание на pumpable
работ, хотя это не совсем четко задокументировано как правильный способ делать вещи:
use strict;
use warnings;
use IPC::Run;
use 5.12.0;
my $handle = IPC::Run::start(['sleep', '10']);
while ($handle->pumpable)
{
sleep(0.5);
# do other stuff in the event loop
# so we don't want to block on finish
}
$handle->finish;
print("exited with '" . $handle->result . "'");
Есть ли лучший вариант? finish
, но тогда вы не можете выполнять другую работу в цикле событий, пока вы ждете завершения процесса.
Я удивлен, что это не просто
$handle->running
или
$handle->finished
Я пропускаю что-то очевидное?
Аналогичным образом, как представляется, не существует документального способа получения pid ребенка (ren).
Блоки '$ handle-> finish', такие как' wait'. Если вы хотите проверить перед ожиданием, вызов завершенного результата 'result'_before_ явно выдает исключение, поэтому вы можете использовать это, проверив исключение -' eval {$ res = $ handle-> result} или напечатав "Still running \ п ";'. Это kludge (нужно проверить '$ @' вместо 'or'-it), но это будет? Существует ряд других версий «результата». Там также есть «сигнал», и я попытался отправить «0», но ничего не возвращаю. Кажется, в документах есть намек на то, что pid не может быть напрямую. – zdim
Ugh. Да, можно попробовать вызвать «результат» и захватить исключение. Ужасно :(Я должен был быть явным, что я ищу неблокирующий способ, иначе я бы просто использовал 'IPC :: Run :: run'. Спасибо. –
Правильно, я получил это, но сказал блокировка на всякий случай. Ужасно, но сейчас я не вижу более чистого пути (я не использовал этот модуль много. Я буду смотреть больше, поскольку я всегда хотел проверить его лучше.) – zdim