2011-12-28 37 views
1

我使用PHP來啓動FFMPEG轉碼命令。這是一個在Ubuntu 10.04 Server上運行的典型LAMP設置,沒有什麼特別的配置。PHP執行返回不正確的進程ID

我遇到的問題是當我運行PHP Exec命令時,它返回不正確的進程ID。而不是返回適當的PID,而是返回2以上的一個。即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手冊網站,該網站是如下一類代碼:

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會產生額外的進程,至少其中一個在後臺,因此$!就會啓動。你可以運行一些額外的測試來檢查這個嗎?首先,不要運行'ffmpeg',而要運行長期存在的東西$cmd,您知道它不會生成後臺進程(例如md5sum /dev/zero),並查看從getPid()獲得的進程ID是否與您在ps中看到的進程ID相符。其次,在運行原始代碼時,ps X(在命令行中)表示正在運行,其中X是由getPid()報告的數字?是否運行ps fwax | grep -3 X(再次替換X)表示X是ID爲X - 2的進程的子進程?

如果這個過程確實是一個由'ffmpeg'產生的後臺進程,你試過殺死它嗎?這可能足以殺死父母程序。

+0

編輯使用內聯代碼標記http://stackoverflow.com/editing-help#code – 2013-02-03 20:29:13