腳本 PHP 在 crontab 中不起作用
早上好,我在我的 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**。