Запустить дочерний процесс

остался вопрос. если "prog > /dev/null 2>&1 &", то по отработке родительского скрипта дочка продолжает работать или нет? потому что некоторые товарищи утверждали, что дочка живет только до тех пор, пока жив родитель. допускаю, что ситуация может быть разной для разных серверов, так как родителем будут совсем разные процессы, httpd в случае mod_php & apache и воркер php-cgi в случае cgi.
 
Конечно продолжает. С родителем "дочку" теперь не связывают даже потоки stdout, stderr. Это отдельный поток. И завершится он может когда угодно, вне зависимости от родителя.

Поведениие будет одинаковым потому как сводится к одинаковым системным вызовам.
 
продолжает, проверил с fcgi,
причем, "2>&1" необязательно, хватит перенаправления основного вывода
 
Автор оригинала: dimagolov
остался вопрос. если "prog > /dev/null 2>&1 &", то по отработке родительского скрипта дочка продолжает работать или нет? потому что некоторые товарищи утверждали, что дочка живет только до тех пор, пока жив родитель. допускаю, что ситуация может быть разной для разных серверов, так как родителем будут совсем разные процессы, httpd в случае mod_php & apache и воркер php-cgi в случае cgi.
Спасибо! Я не догадался, что это действительно может быть причиной различного поведения двух серверов - на самом деле так оно и оказалось :)
 
grigori, для 100% уверенности надо потушить php-cgi :) а то вдруг санта прав? процесс httpd то умирает после отработки скрипта...
 
dimagolov
>>проверил с fcgi,
>надо потушить php-cgi
ты знаешь какой-то еще способ, каким я мог бы проверить? :)
 
grigori, извини, прочитал но не понял прочитанного.

вообще-то разницы в fcgi / mod_php по данному вопросу быть по логике не должно.
 
grigori
>>проверил с fcgi,
>надо потушить php-cgi
ты знаешь какой-то еще способ, каким я мог бы проверить?
Мне кажется, что dimagolov спрашивал останется ли работать запущенная в фоне программа, если убить php-cgi (ну или apache с mod_php).
 
понял, извините, я непонятно написал
запустил дочку, увидел ее по ps, остановил fcgi и проверил по ps: дочка жива
переделал sleep(20) на for (i<20)sleep(1) - так же живет после остановки cgi-демона

я тоже думаю, что разницы с mod_php быть не должно, но не проверял
 
мод-апач - указываю exec() filename для лога - тупо работает, четко как по мануалу.

Извините, если что не так.
 
grigori http://code.google.com/p/php-forker/
код выложу вечером ... (сейчас на работе)
большая просьба просмотри описание, если есть правки, сообщи.
У меня как написать по забугорному - возникают проблемы. как говорится, знал бы прикуп - жил бы в сочи.
Код:
svn checkout [url]http://php-forker.googlecode.com/svn/trunk/php-forker-read-only[/url]
 
"php-forker" is a program written in C.
I is used to start console PHP scripts in the background from a PHP script serving a web request.

Problem description.
The usage of the PCNTL (Process Control support) extension applicable for the task, is not recommended in WEB scripts, and a plain "system()" call from a PHP script creates a zombie shell process:
system('/usr/local/bin/php script.php &');

As a solution, php_forker demonizes a php-cli process that runs a console php script:
system('/usr/local/bin/php-forker /path/to/script.php arg1 arg2');

-~{}~ 02.09.09 01:38:

system('/usr/local/bin/php /path/to/script.php > /dev/null 2>&1 &');
у меня зомби не оставляет, с "> /dev/null" пайп закрывается и sh умирает
 
такой способ когдато нашел: pclose(popen($processcmd, 'w'));
примерно так делал:
PHP:
$bgscript = "bgscript.php {$params} ";
if (substr(PHP_OS, 0, 3) == 'WIN') {
    $processcmd = "start /b C:/php/php.exe {$bgscript} > bg.out";
} else {
    $processcmd = "/usr/local/bin/php {$bgscript} >/dev/null 2>&1 &";
}
pclose(popen($processcmd, 'w'));
пронверял в винде и в фрибсд как для cli так и с mod_php
фоновый скрипт продолжает работать после завершения "родителя"
 
system('/usr/local/bin/php /path/to/script.php > /dev/null 2>&1 &');
у меня зомби не оставляет, с "> /dev/null" пайп закрывается и sh умирает
grigori -спасибо, вечером запосщу твою версию перевода
у меня-то с форкалкой все в порядке??
данная програмка участвовала в одном проекте, вроде все было в порядке. но там был алгоритм посложнее.

php функция demonise() опубликовывалась в инете.
обсуждение похожей темы

запуск будет аналогичен system('/usr/local/bin/php /path/to/foralka.php p1 p2');

fixxxer сказал что проще сделать форкалку на пхп, только не забывать обрабатывать сигналы, тогда зомбиков не будет. (ежу понятно) {примерчик знаю как набросать, на досуге можнго побаловаться}

As a solution, php_forker demonizes a php-cli process that runs a console php script:
system('/usr/local/bin/php-forker /path/to/script.php arg1 arg2');
в моей задаче достаточно передать один параметр, хотя можно при необходимости дописать.
 
Сделал так.
Скрипт PHP генерит два скрипта SH.
Первый скрипт - форк, бросается в суперпапочку, содержание - запуск второго.
Второй скрипт кладется куда положено, делает что надо, но первым делом - уничтожает первый.
Крон каждую минуту запускает n скриптов из суперпапочки. Получается типа многопользовательская система обработки массивных данных... гы!

На самом деле я не все сказал, но в целом - работает :)
 
а кто-то еще пробовал pclose(popen( ... )); ?

у меня тоже отлично работает, на шелл-скриптах тоже проверял
даже без nohup
 
извращенцы:) все:)

PHP:
define('PHP_CLI_BIN', '/usr/local/bin/php');
define('SCRIPT_TO_RUN', dirname(__FILE__) . '/child.php');

$pid = pcntl_fork();
if (0 > $pid) {
    throw new Exception('Could not fork');
} elseif (0 == $pid) {
    pcntl_exec(PHP_CLI_BIN, array('-f', SCRIPT_TO_RUN), $_ENV);
} else {
    pcntl_signal(SIGCHLD, SIG_IGN);
}

В особо запущенных случаях типа использования mod_php можно еще форкнуться заранее разок.
 
fixxxer
они через реал тайм извращаются ))))))
пилят сук ))))) на котором сидят.
 
Сверху