从php调用cron不起作用

时间:2012-07-26 11:17:56

标签: php cron

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

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

我收到错误,如(* system * php-crons)错误的文件所有者(/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)file所有者更改为 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中给出布尔值。  请有人指导我!!

2 个答案:

答案 0 :(得分: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等)。

答案 1 :(得分:0)

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