我已经构建了一个php文件来检查一些结果,所以我需要设置一个cronjob。
我设置一个每30分钟运行一次,以便结果发送。但是,我不知道为什么我的crontab每30分钟就没有运行。
以下是我设置crontab的方法:
*/30 * * * * php /var/www/html/result.php
我已确认我的文件目录是否正确。关于时间部分我不确定:是不是可以使用*/30 * * * *
或30 * * * *
?我设置*/30 * * * *
但没有效果。
答案 0 :(得分:44)
鉴于
*/30 * * * * php /var/www/html/result.php
它有多种可能性无效:
首先,检查php /var/www/html/result.php
的简单执行是否很重要。这是必需的。但不幸的是,实现这一点并不意味着问题得到解决。
必须添加php
二进制文件的路径。
*/30 * * * * php /var/www/html/result.php
要改为
*/30 * * * * /usr/bin/php /var/www/html/result.php
或来自which php
的任何内容。
检查脚本对运行crontab的用户的权限。
授予文件执行权限:chmod +x file
。并确保crontab由具有执行脚本权限的用户启动。还要检查用户是否可以访问该文件所在的目录。
为了更安全,您还可以在脚本顶部添加php路径,例如:
#!/usr/bin/php -q
<?php
...
?>
确保用户有权使用crontab。检查他是否在/etc/cron.d/deny
文件中。另外,做一个基本测试,看看它是crontanb还是php问题。
* * * * * touch /tmp/hello
将脚本的结果输出到日志文件,格式为William Niu suggested。
*/30 * * * * /usr/bin/php /var/www/html/result.php > /tmp/result
使用-f
选项执行脚本:
*/30 * * * * /usr/bin/php -f /var/www/html/result.php > /tmp/result
总结,有很多可能的原因。其中一个应该解决问题。
答案 1 :(得分:7)
可能是因为php不在路径中。 crontab
有一个非常小的path
。所以,包括你的PHP程序的完整路径。
您可以通过将输出传输到文件来测试您的cron命令,例如
*/30 * * * * php /var/www/html/result.php > /tmp/result.log
来自this reference page,在“Crontab环境”下:
cron用来自用户HOME目录的命令调用 shell,(/ usr / bin / sh)。 cron为每个人提供默认环境 shell,定义:
HOME=user’s-home-directory
LOGNAME=user’s-login-id
PATH=/usr/bin:/usr/sbin:.
SHELL=/usr/bin/sh
此外,所有平台可能都不支持/30
语法,因此,请尝试将其更改为0,30
。
答案 2 :(得分:6)
有类似的问题;从命令行,它工作,但从cron,没有去。
有一个“include(”。/ connect.php“);在我的PHP代码中用于db的东西。
删除了它,并将connect.php代码直接添加到php脚本中,并且它来自cron。
答案 3 :(得分:5)
我在Ubuntu 14.04.1
上遇到了类似的问题,问题原来是我修改crontab的方式:
我使用sudo crontab -e
而非crontab -e
,这导致我的更改被忽略。
答案 4 :(得分:3)
我对此很有趣。尽管我的脚本可以手动运行,但不能从crontab运行。
结果表明,因为脚本是从/usr/bin/php
运行的,而不是文件的位置(就像我手动运行时一样),所以我的php require
找不到我想要的文件。更改该地址以反映完整的地址。
以/usr/bin/php -f /var/www/myfile.php
身份运行脚本进行故障排除有助于我发现问题
答案 5 :(得分:1)
经过一天的困惑,为什么我的脚本会直接工作(通过电子邮件将数据发送到gmail帐户)我发现当我点击网址并且所有cron发送都进入垃圾邮件时,所有故意发送都有效。不知道为什么,但我以为我会分享它。
答案 6 :(得分:0)
威廉的回答向我展示了道路。就我而言,我的代码中有一个“include(”connection.php“)”。我将connection.php更改为/my/full/path/connection.php。我有一些相对路径的rename()调用,我改为绝对路径。这对我有用。我希望它可以帮助别人。
答案 7 :(得分:0)
简单合理的方式:
检查/ var / log / cron中的cron日志将为您提供非常有用的信息
less / var / log / cron
例如,
我的cron条目是* * * * * /usr/bin/php /cat.php
&lt; ==每分钟运行cat.php
每次运行cron条目时,日志文件将包含类似于下面的条目
Jan 24 08:06:01 OlaTower CROND[13641]: (root) CMD (/usr/bin/php /cat.php)
Jan 24 08:07:01 OlaTower CROND[13641]: (root) CMD (/usr/bin/php /cat.php)
这里,php命令将每分钟执行一次,每分钟都会在日志文件中有一个条目
如果条目不存在,那么crond甚至不会选择那个cronjob。如果日志条目在那里但仍未获得所需的输出,则命令/应用程序逻辑出现问题
答案 8 :(得分:0)
您确定它没有运行吗?如果您使用exec,请意识到您是从cron运行的,并且需要所有内容的完整路径,因此,您需要使用Data
来代替cp
。
答案 9 :(得分:0)
您可以使用*/30 * * * * wget http://my.domain.com/path/to/php/result.php
但是Crontab使用运行crontab -e
的当前用户执行任务。当您使用wget时,Apache将使用www-data
用户/组对
首先,确保脚本按预期工作。
$ php /var/www/html/result.php
第二,编辑Apache用户帐户的crontab
$ sudo crontab -u www-data -e
或
$ sudo crontab -u root -e
现在添加crontab并输出到日志文件。
*/30 * * * * php /var/www/html/result.php > /tmp/result.log
答案 10 :(得分:0)
作为记录(它可能适用于其他发行版)
我有下一个脚本
* * * * * /usr/bin/php -f /var/www/html/cron.php >/tmp/result.txt
但是执行失败。
在/ var / log / cron日志文件中,我找到了下一行
crond[2213]: (/usr/bin/php) ERROR (getpwnam() failed)
那是什么?
很简单,corn的语法是* * * * *用户命令(检查用户)
* * * * * someuser /usr/bin/php -f /var/www/html/cron.php >/tmp/result.txt
答案 11 :(得分:0)
使用 Ubuntu 和 Vesta :
以下命令对我来说很完美
/usr/bin/php /home/admin/web/mydomain.com/public_html/mycode.php
如有任何问题,请发表评论,祝您愉快:)
答案 12 :(得分:0)
我也被困住了。我正在使用centos 7,不得不运行一些php脚本。我最初尝试过
$crontab -e
&插入了要在午夜12点执行的脚本。
0 0 * * * usr/bin/php /var/www/html/cronjob/myscript.php
但是在var / var / spool / mail / centos中,它在其中的邮件中给了我一个错误
/bin/sh: usr/bin/php: No such file or directory
然后我就这样使用wget,
$ crontab -e
0 0 * * * wget https://myapplicationurl/var/www/html/cronjob/myscript.php
这也给了我一个错误。
ERROR 404: Not Found.
然后我意识到我指定文件夹的错误,因为url已经指向html文件夹,所以要从此处指定该文件夹,就像这样
0 0 * * * wget http://myapplicationurl/cronjob/myscript.php
它奏效了!!! 希望这对像我这样的新手有帮助:)