Как я могу создать процесс в Perl, чтобы он не перестал существовать или не превратился в зомби при выходе из родительского процесса? - PullRequest
1 голос
/ 08 апреля 2011

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

edit: я думаю, что нашел два метода. Надеюсь, кто-нибудь скажет мне, какой из них более уместен?

  1. настройка $ SIG {CHLD} = 'IGNORE';
  2. использовать POSIX 'setsid';

edit: порожденный процесс также будет другим Perl-скриптом.

1 Ответ

4 голосов
/ 08 апреля 2011

Процесс становится зомби, когда он выходит и до того, как его родительский процесс получает свой статус с помощью wait(). Когда один процесс разветвляется на другой, а затем завершается, дочерний процесс становится родителем pid 1 (классически «init»), который сразу же получает состояние процесса. Поэтому обычно проблема заключается в том, что вы описываете наоборот: ребенок становится зомби (поскольку родитель не был написан, чтобы иметь дело с SIGCHLD и вызывать wait()), но когда родитель выходит, зомби наследуется init и сразу пожали. Фактически, обычное решение полностью отделить дочерний процесс от его родителя («daemonize») включает в себя преднамеренное разветвление и выход из промежуточного процесса, так что демон сразу становится потомком init.

Изменить: Если вы находитесь в оболочке и хотите добиться этого эффекта, попробуйте (subprocess &). В скобках создается подоболочка, которая выполняет subprocess в фоновом режиме, а затем немедленно завершается.

...