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

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

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

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

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

1 ответ

Решение

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

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

Другие вопросы по тегам