Ubuntu

腳本 PHP 在 crontab 中不起作用

  • June 17, 2013

早上好,我在我的 ubunut 伺服器中有一個腳本,它可以檢查數據庫中的一些值,如果條件為真,請發送一些電子郵件。如果我在瀏覽器中啟動腳本,例如:

http://www.my_site.com/reports/generate.php

這行得通,郵件到了。

如果進入我的 crontab,我將這一行寫入文件 /etc/crontab:

0  12  * * * root php /var/www/reports/generate.php

這不起作用,郵件沒有到達並且價值相同。我檢查了路徑並且是正確的,我給這個文件 777 權限,但在 cron 中不起作用。

有人可以解釋一下為什麼在 cron deos 中不起作用嗎?

此腳本大約需要 5 分鐘才能結束。

這是腳本的 syslog.log rfer

Jun 17 12:00:03 site /USR/SBIN/CRON[5352]: (root) CMD (   php /var/www/reports/generate.php)
Jun 17 12:00:07 site postfix/pickup[2834]: 10546128001: uid=0 from=<root>
Jun 17 12:00:07 site postfix/cleanup[5381]: 10546128001: message-id=<20130617100007.10546128001@site.localdomain>
Jun 17 12:00:07 site postfix/qmgr[3259]: 10546128001: from=<root@site.localdomain>, size=941, nrcpt=1 (queue active)
Jun 17 12:00:08 site postfix/local[5384]: warning: dict_nis_init: NIS domain name not set - NIS lookups disabled
Jun 17 12:00:08 site postfix/local[5384]: 10546128001: to=<vpsimple@site.localdomain>, orig_to=<root>, relay=local, delay=2, $
Jun 17 12:00:08 site postfix/cleanup[5381]: 438CD128002: message-id=<20130617100008.438CD128002@site.localdomain>
Jun 17 12:00:08 site postfix/qmgr[3259]: 438CD128002: from=<>, size=2759, nrcpt=1 (queue active)
Jun 17 12:00:08 site postfix/bounce[5386]: 10546128001: sender non-delivery notification: 438CD128002
Jun 17 12:00:08 site postfix/qmgr[3259]: 10546128001: removed
Jun 17 12:00:08 site postfix/local[5384]: 438CD128002: to=<xxx@site.localdomain>, orig_to=<root@site.localdomain>, re$
Jun 17 12:00:08 site postfix/qmgr[3259]: 438CD128002: removed
Jun 17 12:03:24 site kernel: Shorewall:net2fw:DROP:IN=eth0 OUT= MAC=00:16:3e:70:a5:ad:00:30:48:56:76:d3:08:00 SRC=122.228.129.25$
Jun 17 12:09:03 site /USR/SBIN/CRON[6104]: (root) CMD (  [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/l$
Jun 17 12:13:13 site kernel: Shorewall:net2fw:DROP:IN=eth0 OUT= MAC=00:16:3e:70:a5:ad:00:30:48:56:76:d3:08:00 SRC=61.188.37.237 $
Jun 17 12:15:32 site postfix/pickup[2834]: 2B3B1128001: uid=33 from=<www-data>

————————-編輯———

我有改變此模式下的文件 crontab:

0 13 * * * root php /usr/bin/php -f /var/www/reports/generate.php 1>/dev/null 2>&1

並且不起作用,這是新的 syslog.log

Jun 17 13:00:03 site /USR/SBIN/CRON[9886]: (root) CMD (   php /usr/bin/php -f /var/www/reports/generate.php $
Jun 17 13:01:19 site kernel: Shorewall:net2fw:DROP:IN=eth0 OUT= MAC=00:16:3e:70:a5:ad:00:30:48:56:76:d3:08:00 SRC=122.141.177.11$
Jun 17 13:09:02 site /USR/SBIN/CRON[10624]: (root) CMD (  [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/$
Jun 17 13:17:02 site /USR/SBIN/CRON[11246]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly 1>/dev/null 2>&1)

您必須編寫 php 執行檔的完整路徑(可能是 /usr/bin/php):

0 12 * * * root /usr/bin/php -f /var/www/reports/generate.php

-f 參數不是強制性的,但有助於 php 解析器。

編輯:“root”使用者在您寫入 /etc/cron.{d, hourly, daily,weekly,monthly} 目錄的文件中是強制性的,但如果您使用的是“舊”crontab (crontab -e),則使用者始終是 root,並且不是必需的。檢查“/var/log/cron” “/var/log/syslog”文件以發現真正的錯誤。

僅供參考:如果您不想在 crontab 中執行 PHP,您始終可以通過添加以下內容來指向腳本內的 PHP:

#!/usr/bin/php -q

到腳本的第一行。這建議腳本必須在 PHP 下執行,並且無需在實際腳本之前將 PHP 命令添加到 crontab。

當您需要列出/觀察系統上的程序時,上面實際上也是一個很好的解決方案。如果在腳本前面使用 PHP 命令,則程序列表可能只顯示它,而不僅僅是腳本的名稱。

此外,如果您不想從腳本接收執行數據到郵箱(通常是根),您可能需要在腳本之後添加**> /dev/null 2>&1**。

引用自:https://serverfault.com/questions/516266