2012-12-20 81 views
1

有沒有一種方法可以讓一個php腳本(apache用戶)使用AT守護進程來安排任務?如何讓php/apache使用AT守護進程安排任務

我想管,從我的PHP腳本這樣的任務交給了ATD:

exec("echo 'date > /some/dir/date.txt' | at now + 1 minute > /dev/null &"); 

當我運行命令行的PHP腳本(根),一切都很好, 然而,當我通過http請求運行腳本,at作業永遠不會被創建。

我知道apache沒有shell訪問權限,有沒有可用的解決方法?

回答

0

exec()不使用外殼,所以你不能用管道等。

使用反引號,shell_exec()system()代替,使其工作。

shell_exec("echo 'date > /some/dir/date.txt' | at now + 1 minute"); 
+0

tnx ThiefMaster,使用shell_exec我的error_log顯示「由於安全原因已禁用了shell_exec()」。我不確定如果啓用它會有什麼影響。 –

+0

通常共享的託管公司通過php.ini禁用它,因爲它們不希望PHP應用程序運行shell命令。通常他們的安全性很差(所有客戶都在同一個用戶組中,因此只受到open_basedir等其他客戶文件的限制),而且shell命令明顯規避了這種限制) – ThiefMaster

0

如果你的腳本下(Apache或一個CGI用戶)運行的帳戶沒有shell訪問,在將無法正常工作,因爲失去作用的外殼(如/ bin中/壞)將嘗試運行命令稍後的。

檢查,如果你可以Exec的東西:

$output = array(); 
exec('whoami',$output); 
print_r($output); 

如果這樣做的工作,你可以嘗試像(僞):

write "date > /some/dir/date.txt" in /tmp/atcmd 
exec("/usr/bin/at -f /tmp/atcmd now + 1 minute"); 

因此,你需要: - 一個shell來運行命令,後來在 - Permision在php中運行exec函數 - 沒有任何問題/etc/at.{deny,allow}

這基本上意味着(我猜)你需要一個運行在php-cgi中的PHP切換到「真實」帳戶。

我現在唯一能想到的其他解決方案是在Web服務器上創建需要的腳本,並使用wget在您有權訪問的計算機上運行at作業。

echo "wget -q http://myserver.mydomain/my/atscript" | at now + 1 minute 

人們實際上使用類似cron的行爲的構造。嘿,我甚至可能會在我的託管服務上設置類似的服務:-)