我的服务器运行在 Ubuntu 14.04 和 nginx 上。我的问题涉及克罗恩,我想使用文件启动它(crontab)-计划任务文件,其内容:
* * * * * /usr/bin/php /var/www/html/test.php >> /var/log/cron.log
如果我使用以下命令运行它:crontab /var/www/html/cron.txt
,它运行完美,脚本测试.php正在执行。但是,当我使用 PHP 脚本(通过浏览器执行)执行相同操作时:exec('crontab /var/www/html/cron.txt');
,它不起作用。
通过命令检查当前 cronjob:,crontab -l -u www-data
文件中的行出现了,但 Cron 并没有执行其工作。也许这与某些权限问题有关?因为它只能以 root 身份执行。有没有办法强制 Cron 也执行 www-data 的任务?
答案1
我不清楚你想要实现什么。据我所知,你需要执行一个 cron 作业,如下所示www-数据用户。通常(强烈建议)www-data 用户无权访问 shell。但您可以以 www-data 的身份执行 cron 任务,将您的任务放在根 cron 中,如下所示:
* * * * * su www-data -s /bin/bash -c "/usr/bin/php /YOUR_PATH/task.php"
这也是一种干净的方法,因为您将系统的所有 cron 作业集中在一个文件中,但每个任务都以所需的用户身份运行(具有适当的权限和属性)。
您可以更改 * * * * 参数以调整作业的计划。在我的示例中,它每隔一分钟运行一次。
希望能帮助到你。
答案2
你想要一些奇怪的东西。为什么你要从 php 脚本执行 crontab?Crontab 是一个基于时间的作业调度程序,它不应该从 php 脚本运行。如果你想以 www-data 的形式启动 cronjob,你应该通过命令对其进行配置crontab -u www-data -e
,之后你的作业就会按照你配置的方式执行。
答案3
我设法实现了我想要的,我最初的帖子中的代码一切都没问题,我唯一应该知道的是 www-data 用户不允许写入/var/log
,所以我没有输出。此外,在我的 PHP 脚本中,我试图创建一个文件并向其中写入一些内容,要做的是,绝对路径是必需的,所以它应该看起来像:
dirname(__FILE__) . '/myfile.txt';
经过这些更改后,一切都按预期进行。
答案4
Nextcloud 也需要同样的东西。他们似乎无法让 PHP 在其安装程序中设置 Cron 作业,并坚持让 Linux 管理员这样做。
那么,对于您的第一个问题:如何使用 PHP 设置 www-data crontab 作业?答:不需要,这需要从 Shell 完成。
至于您的第二个问题:crontab 可以运行 www-data 作业吗?答:完全可以,但那部分是在设置 crontab 作业时完成的。使用www-data
任何 cron 文件内部执行 cron 作业都是一个坏主意,只需让www-data
crontab 作业本身运行即可。
以下是我使其工作的方法:
- 你的字符串可能应该是:
* * * * *
php -f
/var/www/html/test.php >> /var/log/cron.log
www-data
作为 Cron 用户很挑剔。
从终端,按如下方式设置 Cron:
root
正在以...身份运行
crontab -u www-data -e
...添加要运行的字符串,类似于你的 Q。
...但是,您似乎想使用 PHP 来设置 crontab 作业。(我假设这是一个 PHP 安装程序。)使用 PHP 应用程序设置 crontab 作业可能是不可能的。这甚至可能不是一个好主意。如果您可以做到,请务必告知 Nextcloud 开发人员,因为他们似乎也不知道该怎么做。