0

Cron 无法正常工作。我使用以下命令在 /etc/cron.d 中创建了一个文件

$ touch /etc/cron.d/php-crons
$ chown www-data /etc/cron.d/php-crons

我得到了像(*system*php-crons) WRONG FILE OWNER (/etc/cron.d/php-crons)这样的错误 ,所以我将文件所有者更改为root

$ chown root /etc/cron.d/php-crons

即使 cron 不工作。我的php文件(cron.php)如下

 $fp = fopen('/etc/cron.d/php-crons', 'a');
 fwrite($fp, '10 * * * * root usr/bin/php PATH TO SCRIPT/email.php'.PHP_EOL);
 fclose($fp);

当我在那里打开 /etc/cron.d/php-crons 时,我可以看到这项工作。

 10 * * * * root usr/bin/php /var/www/PATH TO SCRIPT/email.php

在 email.php 我包括

  #!/usr/bin/php
 mail ("examplemail@gmail.com", "Cron Successful Public HTML!", "Hello World from cron.php!");

如果我将 (/etc/cron.d/php-crons) 文件所有者更改为root,然后在浏览器中运行cron.php,那么我无法在 /etc/cron.d/php-crons 中写入任何内容并收到警告为跟随。

警告:fopen(/etc/cron.d/php-crons):打开流失败:第 2 行 /var/www/cron.php 中的权限被拒绝警告:fwrite() 期望参数 1 是资源,布尔值在第 3 行的 /var/www/cron.php 警告:fclose() 期望参数 1 是资源,布尔值在第 4 行的 /var/www/cron.php 中给出。请有人指导我!

4

2 回答 2

1

有几个问题。正如您所注意到的,您的 cron 守护程序的实现不允许非 root 用户拥有的文件,并且出于同样的安全原因,您将不允许将该文件设为全局可写。

至少在示例中,您的 cron 作业行列出了应该是绝对的相对路径(“usr/bin/php”)。您的 cron.php 文件归 root 所有并不意味着它以 root 用户身份运行。它由 PHP 执行和运行,因为它具有适当的组和/或其他权限位。并且您不应该以 root 身份运行的方式更改权限(例如使用 setuid-chmods)。

您可能应该做的是一个 cronjob 行,它充当 PHP 脚本的包装器。PHP 脚本从数据库中读取您的所有作业并执行它们,甚至是类似于您已经创建的文本文件。

这样,您可以以非 root 用户身份运行包装脚本。大多数 cron 实现允许您在脚本之前使用“su”命令命名其他用户(例如 www-data)(参见man 5 crontab等)。

于 2012-07-26T11:54:32.087 回答
0

您使用的是哪个操作系统?通常对于这样的事情,你想使用每个用户的 crontabs。因此命令以该用户身份运行。/etc/cron.d 用于系统 crontab。(/var/spool/cron/crontabs) 是存储用户 crontab 的位置,但需要启用它们。通常通过将允许使用它们的用户添加到 /etc/cron.allow。允许 Web 进程更改以 root 身份运行的文件确实是个坏主意。使用每个用户选项,它只能触摸它通常可以触摸的东西,因此安全风险较小。

于 2012-07-26T11:54:59.230 回答