2010-11-05 62 views
1

我有这样的剧本,如果我运行它,我从所列出使用top命令的一个在数据库中输入一个不同的PID号:PHP后台进程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(随机数,现在choosen只是提出一个观点)

与顶级commnand上市

PID号:11161.

列出了top命令的PID号总是由2

更大然后从数据库中之一,它让我发疯...

感谢,

克里斯蒂安。

+0

“11159”的顶部(或'ps aux')是什么?有没有机会是'nohup'? – ircmaxell 2010-11-05 16:38:58

+0

再次运行函数,我得到了这个结果:7696 httpdusr 1856 S/opt/bin/bash/opt/bin/plowdown使用top,在数据库中输入了7694 ... ??? – Chris19 2010-11-05 16:57:24

+0

但是什么是'7694'?我的猜测是你得到的PID返回的是'nohup'的pid。但是'nohup'作为一个新的进程跨越了自己的tty,所以pid应该和'nohup'不同# – ircmaxell 2010-11-05 17:01:10

回答

2

$$返回运行命令的脚本的PID,不是最后执行的命令的PID。举例来说,在bash shell中回显$$通常会返回bash本身的PID。从脚本中回应$$将返回脚本的PID。

那么,为什么你会得到一个+2差异的原因是因为:

  • EXEC()产卵1周
  • 的nohup与PID 2执行的 “壳” 与PID
  • 在/ usr /斌/ plowdown与PID 3
  • 回声执行$$将shell的PID,这是1
+0

但是如果我应用相同的逻辑并通过Putty运行命令,我应该得到nohup的PID,并且plowdown的PID应该是nohup_PID + 1。但如果我在该列表中运行顶部命令,则可以看到plowdown具有与刚刚运行的命令输出的PID相同的PID。非常有趣...谢谢。 – Chris19 2010-11-06 04:45:29

+0

我没有nohup就运行了$命令,并且发生了同样的事情,数据库中存储的PID与顶部列出的PID之间存在+2的差异。 ??! – Chris19 2010-11-06 05:12:54

1

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

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

圆括号外的通知&并没有分号之后。

+1

同样的事情,如果我尝试你的代码,差异仍然存在。我需要看看我是否在另一台机器上尝试了同样的规则,如果证明这是一个“常量”,我可以将该值添加2并将其输入到数据库中。谢谢。 – Chris19 2010-11-06 04:38:25