2011-05-28 138 views
0

我想運行shell的「at」命令並獲取結果狀態,我使用了以下腳本,它在計劃作業列表中添加一個條目並在一分鐘後執行它(僅舉例):如何在PHP中獲取「at」shell命令輸出?

try{ 
    $output = shell_exec("at now + 1 minutes \n curl http://www.mysite.com/test.php?key=value"); 
    echo $output; 
} 
catch (Exception $e) { 
    echo "Error :" . $e->getMessage(); 
} 

該命令執行得很好(我用「atq」shell命令檢查了這個命令,並且頁面test.php的腳本也在一分鐘後按計劃執行),但變量$ output什麼也沒有返回!

我用exec,system和passthru函數代替了shell_exec,但始終沒有任何輸出。

我想讓此函數的返回值檢索添加的作業ID並保留以備後用(例如,刪除此作業)。

回答

0

不會像這樣工作。使用換行符分隔的程序輸入數據不是調用程序的shell命令的一部分。這個數據一旦運行就需要傳遞給程序的STDIN。

您必須打開程序併爲標準輸入和標準輸出提供資源指針。比你能讀/寫/從他們

看看文檔和這個PHP函數的例子:

http://www.php.net/manual/en/function.proc-open.php

爲「如何讓輸出」:

這在某種程度上是無關緊要的,因爲你不能像使用這種方法那樣使用程序。但是如果您只想從STDOUT捕獲/傳遞數據,則可以使用passthru()。你可以打開輸出緩衝來捕獲輸出。例如,如果您想在調用它的php-cli腳本中顯示rsync的狀態欄,那麼它很有用。的

+0

是的,我只是想從STDOUT捕獲數據,而當我用中繼()該命令執行得很好,但沒有發出任何數據! – Toskydao 2011-05-31 17:23:08

0

而不是試圖設置您的命令一樣,你可以使用echo用管子做你想要什麼:

try{ 
    $output = shell_exec('echo "curl \'http://www.mysite.com/test.php?key=value\'" | at now + 1 minutes'); 
    echo $output; 
} 
catch (Exception $e) { 
    echo "Error :" . $e->getMessage(); 
} 
+0

你的腳本執行完美,但沒有輸出! – Toskydao 2011-05-31 17:13:59