我想从 cron 运行 PHP 脚本。我使用以下命令设置 cron:
*/1 * * * * php /var/www/html/cron/cron_job.php
我可以在 中看到它crontab -u root -l
,但作业未执行。当我直接从命令行运行命令时,它也不起作用,如下所示:
<?php /var/www/html/cron/cron_job.php
我尝试了很多与 cron 相关的答案,但都不起作用。例如:
/usr/local/bin /var/www/html/cron/cron_job.php
/usr/local/bin/php /var/www/html/cron/cron_job.php
sudo php -f /var/www/html/cron/cron_job.php
测试 php 脚本(cron_job.php
)是:
php file_put_contents ('test.txt',"test content\n",FILE_APPEND);
文件权限全部正常,并且在浏览器中运行或者在打开终端/var/www/html/cron/
并运行时都可以正常工作php cron_job.php
。
根据评论中的要求,如果我附加2> /tmp/php.log
使用php /var/www/html/cron/cron_job.php
具有语法错误的脚本并尝试php /var/www/html/cron/cron_job.php 2> /tmp/php.log
从菜单终端运行(),则错误日志会收到错误消息。
答案1
您的脚本几乎肯定会运行并创建文件。它只是没有在您期望的位置创建它。您没有在脚本中使用任何路径,而只是使用文件名。这意味着该文件将在脚本运行的目录中创建。
这就是为什么当您进入特定目录并在那里运行脚本时,您会认为它有效。因为文件是在运行它的目录中创建的,所以您可以看到它。默认情况下,cron
在运行它的用户的主目录中运行。由于这是 root 的 crontab(顺便说一句,这不是一个好主意),因此文件将在中创建/root
。所以,去检查一下:
sudo ls /root/test.txt
因此,下次,请为脚本提供完整路径,而不仅仅是文件名:
<?php file_put_contents ('/path/to/test.txt',"test content\n",FILE_APPEND); ?>
现在,该文件将在 中创建/path/to
。
答案2
默认情况下,Cron 任务在用户的主目录中执行。如果您的脚本中未提供要保存输出文件的路径,则它将保存到执行脚本的目录中。
您的 PHP 脚本中缺少文件路径test.txt
。您可以将其设置为绝对值,如 @terdon 所述回答,或者您可以将其作为相对路径提供(具有适当的来源)。例如,如果test.txt
应该位于与 相同的目录中cron_job.php
,则脚本的内容应如下所示:
<?php
$path = realpath(dirname(__FILE__));
file_put_contents ("$path/" . 'test.txt',"test content\n",FILE_APPEND);
?>
或者,如果您不想更改脚本,您可以按以下方式更改 Cron 作业:
*/1 * * * * cd /var/www/html/cron/ && php cron_job.php