1

私のApacheサーバーのPHPページから、次のような行を使用していくつかのコマンドを実行します:

exec("{$command} >> /tmp/test.log 2>&1 & echo -n \$!");

ここで引数の説明を見ることができます。

しかし、私は何かを理解していません.Apacheサーバーを再起動または停止すると、コマンドも停止します.

root@web2:/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
root@web2:/sx/temp#  /etc/init.d/apache2 restart
Restarting web server: apache2 ... waiting ..
root@web2:/sx/temp# ps ax | grep 0ff | grep -v grep
root@web2:/sx/temp# 

いくつかの調査の後、親 pid に関するいくつかのことを読みました&が、コマンドライン内で a を使用して、実際に子プロセスを親から切り離していると思いました。

libapache2-mod-php5 および apache2-mpm-prefork で apache2 を使用しています。

子供向けプログラムをApacheから切り離すにはどうすればよいですか?

編集

この方法で Linux/Mac で再現できます。

a) 以下を含む execute_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 秒間にコマンドを実行すると、次の出力が得られます。

php@beast:/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.
php@beast:/var/www/xxx/$

ご覧のとおり、psコマンドの出力は 1 回だけです。これは、実行されたスクリプトが apache の再起動時に停止したことを示しています。

4

2 に答える 2

1

最初に、例の「&」は、コマンドechoを連結する単なるブール AND であることに注意してください。コマンドをbackgroundで開始する場合、つまり exec がすぐに戻る場合&は、コマンド ラインの最後で を使用します。

exec("{$command} >> /tmp/test.log 2>&1 & echo -n \$! &");

apache の終了後にプロセスを実行したい場合は、次を使用してプロセスをデーモン化する必要があります。pcntl_fork()

次に例を示します。

$pid = pcntl_fork();

switch($pid) {
    case -1 : die ('Error while forking');

    case 0:  // daemon code
         posix_setsid(); // create new process group
         exec("{$command} >> /tmp/test.log 2>&1 & echo -n \$!");
         break;
    default: 
         echo 'daemon started';
         break;

}

現在、戻り値とexecその出力を処理する開始 PHP スクリプトにはコードがありません。そのため、現在のプロセスが終了する前execに終了する可能性があります。この後、ワーカー プロセスは によって所有さinitれます。


また、PEAR パッケージもご覧くださいSystem_Daemon。これは、スクリプトをデーモン化するのに役立ちます。

于 2013-04-12T15:59:28.560 に答える