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

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

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

  1. установка $SIG{CHLD} = 'ИГНОРИРОВАТЬ';
  2. использовать POSIX 'setsid';

редактировать: порожденный процесс также будет другим сценарием perl.


person Incognito    schedule 08.04.2011    source источник


Ответы (1)


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

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

person Ben Jackson    schedule 08.04.2011
comment
так ты говоришь, что я должен использовать setsid? Есть ли разница между двумя перечисленными способами? - person Incognito; 08.04.2011
comment
@Incognito, он сказал, что вы не можете получить зомби после того, как родитель ушел. Ни один из двух методов не избавит от зомби, которых не существует. - person ikegami; 08.04.2011