2011-07-07 136 views
2

所以,我成立了一個cronjob運行以下命令:PHP Cronjob - 權限被拒絕?

php /var/www/path/to/cron/do-stuff.php

的路徑是正確的。該目錄歸www-data所有。

的腳本執行以下操作:

chdir(getcwd()); 
echo shell_exec('whoami'); 

$handle = fopen(uniqid('TEST_') . '.tst'); 
fwrite($handle, 'foo'); 
fclose($handle); 

這是輸出試圖運行cron作業時,我得到:從外殼採用su www-data執行此操作時

www-data 
PHP Warning: fopen(TEST_4e15266d09fa2.tst): failed to open stream: Permission denied 

然而 - 腳本執行得很好,並生成測試文件而不會出現呃逆。

任何想法,爲什麼這可能是?

編輯:我猜su www-data可能是不必要的,因爲PHP將然而運行它運行,但我想,以防萬一。儘管如此,您可以從輸出中看到cron和腳本作爲www-data執行。

回答

4

你有沒有試過把完整路徑fopen函數,而不是僅僅的文件名?

+0

賓果!我是個白癡。 'getcwd'正在報告'/ usr/share/webmin/cron'。 – Greg

0

我相信,即使這是在cron,PHP本身仍然運行,因爲它是默認的用戶(這是什麼可以改變,當然),這不能合理地改變。我可能是錯的。嘗試將目錄分組到PHP系統用戶(apache?)並給予組寫入權限。然後看看是否有效。

+0

我雖然'www-data'是php用戶?我的意思是,這就是'whoami'所顯示的。我只是不明白在一個實例中腳本是如何被阻塞的,而不是在後者中。 – Greg

+1

哪位用戶正在運行cron? ..? – arkigos

+0

萬維網數據 - 事實證明,這是getcwd,這是問題。 – Greg

2

cron作業以完全不同的方式處理PATH。 如果您未指定PATH,那麼在從命令行調用通常工作的相同腳本時,如果從crontab調用它,可能會返回像這樣的權限錯誤。

嘗試改變行:

$handle = fopen(uniqid('TEST_') . '.tst'); 

在這樣的事情:

$handle = fopen('/var/www/vhosts/yourpath/'.uniqid('TEST_') . '.tst'); 

它爲我工作。