php后台进程PID问题

时间:2010-11-05 16:32:59

标签: php exec

我有这个脚本,如果我运行它,我会在数据库中输入一个与top命令列出的不同的PID号:

<?php
error_reporting(0);

include_once "config/mysql.php";

// the path
$path = "PATH=$PATH:/share/MD0_DATA/.qpkg/Optware/bin:";

//random number for the log file name
$random = rand(1,500000);

//initial download location
$init_loc="/share/MD0_DATA/Qdownload/plowshare";

$items = rtrim($_POST['items'],",");
$sql = mysql_query("SELECT url, pid FROM plow WHERE id IN ($items)") or die ('Error: ' . mysql_error());

while ($db_row = mysql_fetch_assoc($sql)) { 
  //random number for the log file name
  $random = rand(1,500000);
  //log file name
  $out_file = '/share/MD0_DATA/Qdownload/plowshare/Logs/log'.$random.'.txt';
  //command 1
  $command = exec("($path" . " nohup /opt/bin/plowdown -o '$init_loc' " . "'".$db_row['url']."' 2> " . "'$out_file' > /dev/null &);" . "echo $$;", $out); 
  exec($command, $out);
  $query = mysql_query("UPDATE plow SET state = 'Active', pid = '$out[0]' WHERE id IN ($items)") or die ('Error: ' . mysql_error());
 }
mysql_close();

?>

结果总是一样的:

在数据库中输入的Pid号:11159(随机数,现在选择只是为了说明一点)

使用top commnand列出的Pid号码:11161。

使用top命令列出的PID编号总是大于数据库中的编号2。

这让我发疯了......

谢谢,

克里斯蒂安。

2 个答案:

答案 0 :(得分:2)

$$返回运行命令的脚本的PID,不是上次执行的命令的PID 。例如,在bash shell中回显$$通常会返回bash本身的PID。从脚本回显$$将返回脚本的PID。

所以,你得到+2差异的原因是:

  • exec()产生一个带PID 1的“shell”
  • 使用PID 2执行nohup
  • 使用PID 3 执行
  • / usr / bin / plowdown
  • echo $$返回shell的PID,即1

答案 1 :(得分:1)

像netcoder一样,你不能使用$$,而是$!返回最后一个后台进程的pid。试试这样的事情

$command = exec("($path" . " nohup /opt/bin/plowdown -o '$init_loc' " . "'".$db_row['url']."' 2> " . "'$out_file' > /dev/null ) & " . 'echo ${!};', $out); 

注意括号外的&,后面没有分号。