Perl, ожидающий выхода из дочернего процесса - PullRequest
2 голосов
/ 28 февраля 2011

У меня есть сценарий, который используется для повторного развертывания нескольких программ в пользовательской среде сервера (т. Е. Не установленный стандартный контейнер, в котором есть код горячей замены). Для этого он отключает серверные процессы, но для полного закрытия всех их соединений требуется некоторое время. Это не дочерние процессы perlscript. Обычно они запускаются в течение сотен дней за раз, поэтому я бы предпочел не оборачивать серверные процессы в perlscripts, просто чтобы я мог разветвить их, чтобы элегантно завершить их месяцы или годы спустя.

Так что в настоящее время, чтобы дождаться их смерти во время повторного развертывания, я анализирую вывод ps -ef, захватывая поле pid, убив этот pid, ожидая 60 секунд (что кажется разумным временем для этих процессов), перепроверяя ps -ef чтобы убедиться, что они мертвы и т. д. Продолжайте копировать, chmods и т. д.

Это решение кажется мне хромым / неуклюжим. Я гуглил по всему и не видел ничего по этой конкретной теме; есть куча материала о том, как ждать на раздвоенных детях, и waitpid был бы идеальным, если бы он действовал таким образом.

Из прочтения Как ждать выхода из дочерних процессов (что является c специфичным) Я предполагаю, что на самом деле я ничего не могу сделать, кроме чтения / proc / pid вместо этого , но я подумал, что, может быть, где-нибудь найдется специфичное для Perl решение. Есть идеи?

Ответы [ 2 ]

4 голосов
/ 28 февраля 2011

Вы можете использовать kill 0, $pid (возвращает 1 в случае успеха и 0 в случае неудачи) вместо перепроверки ps -ef, но при этом возможно, что pid мог быть повторно использован.

Если у вас уже естьps-парсинг кода, вероятно, не стоит его переключать, но есть Proc :: ProcessTable .

Кроме этого, никаких идей.

0 голосов
/ 28 февраля 2011

В Unix \ Linux только родительский процесс получает сигнал при выходе из родительского процесса - это функция ОС, а не язык.

Другие решения будут эквивалентны вашим - проверка таблицы процессовдля существования процесса (хотя конкретный метод может отличаться - например, использование ps или прямой запрос к ядру)

...