Как создать процесс в Perl, чтобы он не перестал существовать или не превратился в зомби при выходе из родительского процесса?
У меня есть Perl-скрипт, который я хотел бы создать процесс. Это может занять некоторое время, и в большинстве случаев родительский скрипт завершится. Как мне запустить этот процесс, чтобы, когда родитель ушел, он не превратился в зомби или несуществующий процесс, когда он закончил?
редактировать: я думаю, я нашел два метода. Надеюсь, кто-нибудь скажет мне, какой из них более уместен?
- настройка $SIG{CHLD} = 'IGNORE';
- используйте POSIX 'setsid';
edit: порожденный процесс также будет другим Perl-скриптом.
1 ответ
Процесс становится как зомби, когда он выходит и до того, как его родительский процесс получает статус wait()
, Когда один процесс разветвляется на другой, а затем завершается, дочерний процесс становится родителем pid 1 (классически "init"), который сразу же получает состояние процесса. Поэтому обычно проблема заключается в том, что вы описываете: ребенок становится зомби (так как родитель не был написан, чтобы иметь дело с SIGCHLD
и позвонить wait()
) но когда родитель выходит, зомби наследуется init
и сразу пожала. Фактически, обычное решение полностью отделить дочерний процесс от его родителя ("daemonize") включает в себя преднамеренное разветвление и выход из промежуточного процесса, так что демон сразу становится потомком init
,
Изменить: Если вы находитесь в оболочке и хотите добиться этого эффекта, попробуйте (subprocess &)
, Скобка создает подоболочку, которая выполняет subprocess
в фоновом режиме, а затем сразу же выходит.