2010-11-05 60 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