私の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 の再起動時に停止したことを示しています。