使用exec PHP脚本时出现Crontab问题


crontab issue when using exec php script?

我使用的是elementaryOS(基于ubuntu)

当我运行命令行:

kn3l@kn3l:/var/www/cronjob$ 
25 15 * * * /var/www/cronjob/helloworld.php > /var/www/cronjob/cron.log

,它适用于crontab与终端命令行。

但是当我使用PHP的代码像这样(test.php):

-rwxrwxrwx  1 kn3l kn3l    47 Jun  6 14:59 test.php*

test.php

<?php
    $output = shell_exec('crontab -l');
    echo "<pre>$output</pre>";

转到http://localhost/test.php

为什么我没有看到任何像命令行一样的返回?

有人能帮我吗?

在您的用户crontab中有以下行:

25 15 * * * /var/www/cronjob/helloworld.php > /var/www/cronjob/cron.log

在crontab中,有必要指出哪个二进制文件正在执行脚本。因此,正如hw所示,您需要将其替换为

25 15 * * * <path to php> /var/www/cronjob/helloworld.php > /var/www/cronjob/cron.log

which php得到<path to php>

关于test.php文件,考虑到命令crontab -l是由运行php脚本的用户执行的。也就是运行本地服务器的用户。

我做了一个测试:

$ ps -ef | grep apac
.../...
www-data  1348  1332  0 09:50 ?        00:00:00 /usr/sbin/apache2 -k start

在我的例子中是www-data用户运行apache。

我在/var/www中添加了你的文件:

<?php
    $output = shell_exec('crontab -l');
    echo "<pre>$output</pre>";
?>

在执行时没有出现任何内容。为什么?因为www-data没有crontab:

$ sudo crontab -l -u www-data
no crontab for www-data

我加了一行:

$ sudo crontab -l -u www-data
* * * * * touch /tmp/tt

,现在PHP页面显示:

* * * * * touch /tmp/tt

总结

事情并不是你的脚本不能正常工作,只是显示一个空的内容作为用户www-data的crontab是空的。

try this

<?
$output = shell_exec('crontab -l');
file_put_contents('/tmp/crontab.txt', $output.'* * * * * NEW_CRON'.PHP_EOL);
echo exec('crontab /tmp/crontab.txt');
?>

添加到test.php的第一个字符串

#!/usr/bin/php

您必须以这种方式执行脚本:

25 15 * * * /usr/bin/php /var/www/cronjob/helloworld.php > /var/www/cronjob/cron.log

确保/usr/bin/php在您的系统上是有效的