早上好,我的 ubunut 服务器中有一个脚本,它会检查数据库中的某个值,如果条件为真,则会发送一些电子邮件。如果我在浏览器中启动该脚本,如下所示:
http://www.my_site.com/reports/generate.php
这有效,邮件已到达。
如果在我的 crontab 中我将这行写入文件 /etc/crontab:
0 12 * * * root php /var/www/reports/generate.php
这不起作用,邮件没有到达,值也一样。我检查了路径并且正确,我给了这个文件 777 权限,但在 cron 中不起作用。
有人可以解释一下为什么 cron 不起作用吗?
该脚本大约需要5分钟才能结束。
这是 syslog.log 脚本
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=<[email protected]>
Jun 17 12:00:07 site postfix/qmgr[3259]: 10546128001: from=<[email protected]>, 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=<[email protected]>, orig_to=<root>, relay=local, delay=2, $
Jun 17 12:00:08 site postfix/cleanup[5381]: 438CD128002: message-id=<[email protected]>
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=<[email protected]>, orig_to=<[email protected]>, 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)
答案1
您必须写下 php 可执行文件的完整路径(可能是 /usr/bin/php):
0 12 * * * root /usr/bin/php -f /var/www/reports/generate.php
-f 参数不是强制性的,但有助于 php 解析器。
编辑:在 /etc/cron.{d, hourly, daily, weekly, monthly} 目录中写入的文件中,“root”用户是必需的,但如果您使用的是“旧”crontab (crontab -e),则用户始终是 root,并且不是必需的。检查“/var/log/cron”和“/var/log/syslog”文件以发现真正的错误。
答案2
仅供参考:如果您不想在 crontab 中运行 PHP,您可以随时通过添加以下内容在脚本中指向 PHP:
/usr/bin/php -q 复制代码
到脚本的第一行。这表明该脚本必须在 PHP 下运行,并且无需在实际脚本之前将 PHP 命令添加到 crontab。
当您需要列出/观察系统上正在运行的进程时,上述方法实际上也是一个很好的解决方案。如果您在脚本前面使用 PHP 命令,则存在一个危险,即进程列表仅显示它,而不只是脚本的名称。
此外,如果您不想从脚本接收执行数据到邮箱(通常是根),您可能需要添加> /dev/null 2>&1按照剧本。
答案3
在您的 crontab 行中,将行从
0 12 * * * root php /var/www/reports/generate.php
到
0 12 * * * root /usr/bin/php /var/www/reports/generate.php
也许如果你没有在 crontab 文件中定义 php 的路径,脚本就无法运行。要检查脚本运行之前是否存在此问题,请尝试使用尾部-f / var / log / syslog. -f 选项将所有内容实时地写在屏幕上。
所以你可以检查你的问题是什么。此页面列出了 cron 作业无法运行的原因。 Cron 不运行