LINUX.ORG.RU

Perl: как отключиться от дочернего процесса после fork ?


0

1

Уже две недели пытаюсь найти решение, гугль не особо помогает. Может здесь кто-то подскажет?

После fork() родительский процесс какое-то время ждет пока от дочернего придет сообщение через пайп вида «BYE!\n» и завершается. Порожденный процесс после этого живет своей жизнью.

Вот то, что удалось создать:
http://paste.org.ru/?cbrrgo

Проблема в том, что родительский процесс не хочет завершаться, пока дочерний не закончит работать в фоне.

Как это сделать правильно?

Ни POSIX::setsid в потомке, ни setpgrp в родителе не помагают.

А fork() для каких целей используешь ты?

r2d2 ()
Ответ на: комментарий от r2d2

Дочерний процесс запускает программулину, мониторит её вывод пока не получит что-то типа СТАРТ УСПЕШНО, отправляет родителю по пайпу «BYE!\n», сам же продолжает висеть и слушать запущенную программу, чтобы та не завершилась от SIGPIPE. Родитель завершается, возвращает управление пользователю/оболочке.

По сути это есть обертка чтобы запустить внешнюю тулзу как демон.

KOCMOHABT_bI ()

Порожденный процесс после этого живет своей жизнью.

Зомби, разве это жизнь?

sdio ★★★★★ ()
Ответ на: комментарий от r2d2

Надо продолжнать читать то, что запущенная тулзень пишет в STDOUT, чтобы она не лочилась, но уже ничего не делать.

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

KOCMOHABT_bI ()

Вот то, что удалось создать

if (my $pid = fork()) {
  
  # we are the child

Да ладно :) fork возвращает положительное числу, равное PID потомка, процессу-родителю, 0 - потомку и -1 исходному процессу при ошибках.

quasimoto ★★★★ ()
Ответ на: комментарий от quasimoto

(Ctrl+Enter отправить комент тоже работает, внезапно)

На самом деле это просто я так безобразно лоханулся. Как тут можно потереть псто? :)

Теперь все ок http://paste.org.ru/?2tecgk

KOCMOHABT_bI ()

Порожденный процесс после этого живет своей жизнью.

Он, кстати, демоном будет (его init подберёт) - это то что нужно? Тогда можно поискать на CPAN что-нибудь на тему daemonize.

quasimoto ★★★★ ()
Ответ на: комментарий от quasimoto

Пока устраивает вариант, когда процесс потомок гибнет вместе с закрытием управляющего терминала. Чтоб этого избежать, вроде как надо сделать POSIX::setsid или проигнорировать SIGHUP. А возможно, и то, и то вместе.

На примере CPAN Proc::Daemon и еще пары нагугленных, в т.ч. на питоне, рекомедуется делать ещё один форк в потомке, для того, чтобы «prevent the potential of acquiring a controlling terminal at all and detaches the daemon completely from the first parent». Как потомок может залочить управляющий терминал после освобождения своих дескриптором STDIN, STDOUT, STDERR, не совсем понятно. Видимо, это перестраховка на случай если в дальнейшем по ходу порождающего процесса будет вызов wait(). Тогда это уже не мой случай.

KOCMOHABT_bI ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.