2011-12-28 58 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