從我的Apache服務器的PHP頁面,我用跑的線路像一些命令:使用exec()時真的守護一個命令?
exec("{$command} >> /tmp/test.log 2>&1 & echo -n \$!");
你可以看到的參數here一個交代。
但我不明白:如果我重新啓動或停止我的apache服務器,我的命令也死了。
[email protected]:/sx/temp# ps ax | grep 0ff | grep -v grep
15957 ? S 0:38 /usr/bin/php /sx/site_web_php/fr_FR/app/console task:exec /sx/temp/task_inventaire/ 0ff79bf690dcfdf788fff26c259882e2d07426df 10800
[email protected]:/sx/temp# /etc/init.d/apache2 restart
Restarting web server: apache2 ... waiting ..
[email protected]:/sx/temp# ps ax | grep 0ff | grep -v grep
[email protected]:/sx/temp#
一些研究之後,我瞭解父母的pid一些事情,但使用&
我的命令行裏,我想我是真的脫離我的孩子的過程,從他的父母。
我使用apache2與libapache2-mod-php5和apache2-mpm-prefork。
我怎樣才能真正將我的子程序從apache中分離出來?
編輯
您可以複製它在Linux/Mac上這樣說:
一)創建一個包含executed_script.php文件:
<?php
sleep(10);
B)創建一個execute_from_http。 php文件包含:
<?php
exec("php executed_script.php > /tmp/test.log 2>&1 & echo -n \$!");
c)運行http://localhost/path/execute_from_http.php
終端上d),運行命令:
ps axjf | grep execute | grep -v grep ; sudo /etc/init.d/apache2 restart ; ps axjf | grep execute | grep -v grep
如果運行期間execute_from_http.php腳本的10秒的命令,你會得到輸出:
[email protected]:/var/www/xxx/$ ps axjf | grep execute | grep -v grep ; sudo /etc/init.d/apache2 restart ; ps axjf | grep execute | grep -v grep
1 5257 5245 5245 ? -1 S 33 0:00 php executed_script.php
* Restarting web server apache2
... waiting ...done.
[email protected]:/var/www/xxx/$
正如您所看到的,ps
命令只輸出一次,這告訴您執行的腳本在apache重新啓動時死亡。
已經與高管的進程化的過程,是不是? –
不,它不是。通過exec啓動的進程仍然屬於Apache進程組 – hek2mgl
我最近幾天有同樣的要求,併成功地使用'pcntl_fork()'。我不知道爲什麼,但沒有明確創建新進程組的事件 – hek2mgl