2012-07-26 52 views
0

Cron無法正常工作。我創建內部/etc/cron.d中一個文件,下面的命令從php調用cron不起作用

$ touch /etc/cron.d/php-crons 
$ chown www-data /etc/cron.d/php-crons 

我有錯誤,如(*系統* PHP-crons)錯誤的文件所有者(/etc/cron.d/php-crons) 所以我改變文件的擁有者爲

$ chown root /etc/cron.d/php-crons 

即使cron是行不通的。 我的PHP文件(cron.php)如下

$fp = fopen('/etc/cron.d/php-crons', 'a'); 
fwrite($fp, '10 * * * * root usr/bin/php PATH TO SCRIPT/email.php'.PHP_EOL); 
fclose($fp); 

當我打開/etc/cron.d/php-crons那裏我可以看到這個工作。

10 * * * * root usr/bin/php /var/www/PATH TO SCRIPT/email.php 

在email.php我包括

#!/usr/bin/php 
mail ("[email protected]", "Cron Successful Public HTML!", "Hello World from cron.php!"); 

如果我改變(/etc/cron.d/php-crons)file所有者然後運行cron.php在瀏覽器,那麼我無法在/etc/cron.d/php-crons中寫入任何內容,並獲得警告,如下所示。 (/etc/cron.d/php-crons):無法打開流:第2行的/var/www/cron.php中的權限被拒絕警告:fwrite()期望參數1是資源,布爾在/var/www/cron.php在第3行給出警告:fclose()期望參數1是資源,布爾在/var/www/cron.php在第4行給出。 請有人指導我!

+0

要調試您的PHP代碼(這是產生這些錯誤),我們需要看到您的PHP代碼。 – ghoti 2012-07-26 11:20:43

+0

此外,您可能從未**想要由正由root執行的'www-data'用戶寫入腳本。 – ghoti 2012-07-26 11:21:50

回答

1

有幾個問題。正如你注意到的那樣,你的cron守護進程的實現不允許成爲非root用戶所擁有的文件,並且出於同樣的安全原因,你將不允許這個文件是世界可寫的。

至少在本例中,您的cron作業行列出了應該是絕對路徑的相對路徑(「usr/bin/php」)。你的cron.php文件由root擁有並不意味着它以root用戶身份運行。它由PHP執行和運行,因爲它具有適當的組和/或其他權限位。而且你不應該以root身份運行權限(例如使用setuid-chmods)。

你可能應該做的是一個cronjob行,充當PHP腳本的包裝。 PHP腳本從數據庫中讀取所有作業並執行它們,甚至是一個類似於您已創建的文本文件。

這樣你就可以作爲非root用戶運行包裝腳本。大多數cron實現允許您在腳本之前使用「su」命令的其他用戶(例如www-data)命名(請參閱man 5 crontab等)。

0

您正在使用哪種操作系統?通常對於這樣的事情,你想使用每個用戶crontabs。所以這些命令以該用戶身份運行。 /etc/cron.d用於系統crontabs。 (/ var/spool/cron/crontabs)是存儲用戶crontabs的地方,但需要啓用它們。通常通過添加允許將它們用於/etc/cron.allow的用戶。允許Web進程對以root身份運行的文件進行更改實在是一個壞主意。通過每個用戶選項,它只能觸摸它通常可能觸及的東西,所以安全風險較小。