2012-04-08 19 views
0

私はデーモンとして実行されるPHPスクリプトを持っています。 8つのスレッドが同時に実行されます。PHPとCron - chdirが動作しない

8つのスレッドが常に実行されていることを確認するには、以下のPHPスクリプトはdaemon.phpスクリプトと同じディレクトリにあるのcronから実行される:上記

<?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ではなく)。

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

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

答えて

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); 
} 

?>