0

デーモンとして実行されるPHPスクリプトがあります。一度に8つのスレッドが実行されます。

8つのスレッドが常に実行されていることを確認するために、daemon.phpスクリプトと同じディレクトリにあるcronから次のPHPスクリプトが実行されます。

<?php

chdir('/root/fb');
if (file_exists('pause')) die();

exec('ps ax | grep -v grep | grep daemon.php',$output);
$output=implode("\n",$output);
$num=8-substr_count($output,'daemon.php');
if ($num>0)
 {
 for($run=0; $run<$num; $run++)
  {
  exec('php daemon.php > /dev/null 2>&1 &');
  sleep(20);
  }
 }

?>

上記はdaemon.phpスクリプトを正常に実行しますが、その後、何か奇妙なことが起こり、daemon.phpスクリプト自体は、別のディレクトリにあると見なす場合と、別のディレクトリにあると見なす場合があります。具体的には、exec他のアプリを実行するために多くの関数を使用しますが、これらの多く(すべてではありません)は、元のディレクトリに戻っており、ではないと考えています/root/fb

ディレクトリ内から直接daemon.phpを実行するとphp daemon.php、これは発生せず、すべてが意図したとおりに機能します。

非常にオフな動作。スクリプトがディレクトリ内から直接実行される場合と、cronジョブからの効果がまったく同じになるように設定するにはどうすればよいですか?

4

1 に答える 1

0

おそらく、単純化してより防御的なプログラミングアプローチを採用することで、問題を絞り込むことができます。

<?php

if (!chdir('/root/fb')) die("couldn't chdir");
file_exists('pause')) die("paused");

exec('pgrep -f "php daemon.php"',$output);
$output = implode("\n",$output);
$num = 8 - count($output);
for($run = 0; $run < $num; $run++) {
   /*exec('php daemon.php > /dev/null 2>&1 &');*/
   passthru('echo $PWD');
   sleep(20);
}

?>
于 2012-04-08T15:28:43.303 に答える