7

Некоторое время назад я был очень смущен некоторыми изменениями, которые я обнаружил при переносе скриптов Python из Linux в OS X ...

В Linux, если скрипт Python вызвал os.system() и вызывающий процесс уничтожен, вызываемый процесс будет уничтожен одновременно.

На OS X, однако, если основной процесс убит, все, что он запустил, остается позади.

Есть ли что-то в OS X/Python, где я могу изменить это поведение?

Это вызывает проблемы на нашей ферме рендеринга, где процессы могут быть убиты из графического интерфейса управления, но процесс верхнего уровня на самом деле является просто оболочкой, поэтому, хотя управление фермой рендеринга может подумать, что процесс завершился и машина освобождена для другой задачи, фактическая нагрузка на процессор все еще выполняется, что может привести к огромным блокировкам.

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

1 ответ1

4

В Linux, когда вы убиваете родителя, ребенку отправляется SIGHUP, который обычно убивает его, если он не предназначен для того, чтобы остаться в живых как демон, и в этом случае он перехватит sighup. (Я думаю, именно поэтому обычно используют SIGHUP, чтобы сказать демону о необходимости обновить себя, так как он всегда в ловушке).

В Mac OS X я не могу найти документацию, но похоже, что SIGHUP не отправляется. В результате дочерний процесс становится осиротевшим, а его новый родитель является прародителем.

То, как вы справляетесь с этим, заключается в том, что вы отправляете сигнал уничтожения группе процессов родительского процесса, а не самому родительскому процессу. Это обстреляет всех детей и внуков с одной оговоркой. Если какой-либо дочерний процесс выполняет setpgrp() или setsid(), он избегает членства в группе процессов. Он не получит уничтожение, отправленное его старой группе процессов. Обычно не нужно беспокоиться о последнем, поскольку оно обычно является преднамеренным, когда используется для достижения этой цели.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .