如何使用 PHP 设置以 www-data 形式运行的 crontab 作业?

如何使用 PHP 设置以 www-data 形式运行的 crontab 作业?

我的服务器运行在 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-datacrontab 作业本身运行即可。

以下是我使其工作的方法:

  1. 你的字符串可能应该是:

* * * * *php -f/var/www/html/test.php >> /var/log/cron.log

  1. www-data作为 Cron 用户很挑剔。

从终端,按如下方式设置 Cron:

root正在以...身份运行

crontab -u www-data -e...添加要运行的字符串,类似于你的 Q。

...但是,您似乎想使用 PHP 来设置 crontab 作业。(我假设这是一个 PHP 安装程序。)使用 PHP 应用程序设置 crontab 作业可能是不可能的。这甚至可能不是一个好主意。如果您可以做到,请务必告知 Nextcloud 开发人员,因为他们似乎也不知道该怎么做。

相关内容