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

dimagolov

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

point

Новичок
Конечно продолжает. С родителем "дочку" теперь не связывают даже потоки stdout, stderr. Это отдельный поток. И завершится он может когда угодно, вне зависимости от родителя.

Поведениие будет одинаковым потому как сводится к одинаковым системным вызовам.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
продолжает, проверил с fcgi,
причем, "2>&1" необязательно, хватит перенаправления основного вывода
 

no_santa

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

dimagolov

Новичок
grigori, для 100% уверенности надо потушить php-cgi :) а то вдруг санта прав? процесс httpd то умирает после отработки скрипта...
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
dimagolov
>>проверил с fcgi,
>надо потушить php-cgi
ты знаешь какой-то еще способ, каким я мог бы проверить? :)
 

dimagolov

Новичок
grigori, извини, прочитал но не понял прочитанного.

вообще-то разницы в fcgi / mod_php по данному вопросу быть по логике не должно.
 

phprus

Moderator
Команда форума
grigori
>>проверил с fcgi,
>надо потушить php-cgi
ты знаешь какой-то еще способ, каким я мог бы проверить?
Мне кажется, что dimagolov спрашивал останется ли работать запущенная в фоне программа, если убить php-cgi (ну или apache с mod_php).
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
понял, извините, я непонятно написал
запустил дочку, увидел ее по ps, остановил fcgi и проверил по ps: дочка жива
переделал sleep(20) на for (i<20)sleep(1) - так же живет после остановки cgi-демона

я тоже думаю, что разницы с mod_php быть не должно, но не проверял
 

no_santa

Снегур
мод-апач - указываю exec() filename для лога - тупо работает, четко как по мануалу.

Извините, если что не так.
 

Alexandre

PHPПенсионер
grigori http://code.google.com/p/php-forker/
код выложу вечером ... (сейчас на работе)
большая просьба просмотри описание, если есть правки, сообщи.
У меня как написать по забугорному - возникают проблемы. как говорится, знал бы прикуп - жил бы в сочи.
Код:
svn checkout [url]http://php-forker.googlecode.com/svn/trunk/php-forker-read-only[/url]
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
"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 умирает
 

A1x

Новичок
такой способ когдато нашел: 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
фоновый скрипт продолжает работать после завершения "родителя"
 

Alexandre

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');
в моей задаче достаточно передать один параметр, хотя можно при необходимости дописать.
 

no_santa

Снегур
Сделал так.
Скрипт PHP генерит два скрипта SH.
Первый скрипт - форк, бросается в суперпапочку, содержание - запуск второго.
Второй скрипт кладется куда положено, делает что надо, но первым делом - уничтожает первый.
Крон каждую минуту запускает n скриптов из суперпапочки. Получается типа многопользовательская система обработки массивных данных... гы!

На самом деле я не все сказал, но в целом - работает :)
 

no_santa

Снегур
run-parts работает отлично
nohup выдрессировать так и не удалось.
 

A1x

Новичок
а кто-то еще пробовал pclose(popen( ... )); ?

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

fixxxer

К.О.
Партнер клуба
извращенцы:) все:)

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 можно еще форкнуться заранее разок.
 

nirex

Новичок
fixxxer
они через реал тайм извращаются ))))))
пилят сук ))))) на котором сидят.
 
Сверху