2011-12-28 18 views
1

PHPを使用してFFMPEGトランスコードコマンドを起動しています。これは、Ubuntu 10.04 Server上で動作する典型的なLAMPセットアップですが、設定に関して特別なものはありません。不正なプロセスIDを返すPHP Exec

PHP Execコマンドを実行すると、不正なプロセスIDが返されます。適切なPIDを返す代わりに、代わりに2つのPIDを返します。すなわち、FFMPEGのプロセスIDは3557ですが、PHPのExecは3559を返します。

私はいつもこれを毎月生成しています。問題は、正しいプロセスIDが本当に必要なので、後で私が選択すればプロセスを停止できることです。

FFMPEGのコマンドの機能と問題なく起動するので、私はそれが問題の原因であるとは思わない:

$cmd = "ffmpeg -r 4 -f mjpeg -an -i 'http://" . $internalhost . ":" . $stream_port . "' 
-vcodec libx264 -vpre fastfirstpass -vpre baseline -b 24k -bt 32k -threads 0 
http://localhost:8090/" . $localport . ".ffm"; 
$ffmpg = new Process($cmd); 

私が知っている...「それはかなり醜いですが、それが動作し、私はドン変数が重要であるとは思わない。

私は次のようであるPHPマニュアルWebサイトからクラスを使用していたコードを起動するには:

class Process 
{ 
private $pid; 
private $command; 

public function __construct($cl=false){ 
    if ($cl != false){ 
     $this->command = $cl; 
     $this->runCom(); 
    } 
} 
private function runCom(){ 
    $command = 'nohup '.$this->command.' > /dev/null 2> /dev/null & echo $!'; 
    exec($command ,$op); 
    $this->pid = (int)$op[0]; 
} 

public function setPid($pid){ 
    $this->pid = $pid; 
} 

public function getPid(){ 
    return $this->pid; 
} 

public function status(){ 
    $command = 'ps -p '.$this->pid; 
    exec($command,$op); 
    if (!isset($op[1]))return false; 
    else return true; 
} 

public function start(){ 
    if ($this->command != '')$this->runCom(); 
    else return true; 
} 
public function stop(){ 
    $command = 'kill '.$this->pid; 
    exec($command); 
    if ($this->status() == false)return true; 
    else return false; 
} 
} 

何が起こっていると思うことは、何らかの理由でFFMPEGが、代わりに別の2つのプロセスをキックオフされていることですメインプロセスのPIDを返すと、最後のプロセスのPIDが返されます。

間違っているかもしれませんが、まだ私の頭を傷つけています。

答えて

0

プロセスIDはecho $!にあり、Bashマニュアルには$! "直前に実行されたバックグラウンド(非同期)コマンドのプロセスIDに展開されています"と記載されています。私はFFMPEGが追加のプロセスを生成しているのと同じ感覚を持っているでしょう。少なくとも1つはバックグラウンドにあり、結果的に$!がそれを取り上げます。これを確認するためにいくつかの追加テストを実行できますか?まず、 'ffmpeg'の代わりに、md5sum /dev/zeroなどのバックグラウンドプロセスを生成しないことがわかっている$cmdとして長く生きていたものを実行し、getPid()から取得したプロセスIDがpsと一致するかどうかを確認します。第2に、元のコードを実行すると、ps X(コマンドライン上で)とは何が実行されているのですか?XはgetPid()によって報告された番号ですか? ps fwax | grep -3 X(Xを置き換えると)を実行すると、XがID X-2のプロセスの子プロセスであることが示されますか?

プロセスが実際に 'ffmpeg'によって生成されたバックグラウンドプロセスであれば、それを強制終了しようとしましたか?親プロセスを強制終了するのに十分かもしれません。

+0

インラインコードマークアップを使用するように編集http://stackoverflow.com/editing-help#code –

関連する問題