我使用 cron 来执行一些 php 脚本(owncloud 后台任务等)。我的服务器通过 php-fpm 运行 nginx 和 PHP,默认情况下,php-fpm 在用户下运行 PHP 进程apache
,该用户是除 root 之外唯一具有写权限的用户/var/www
。因此,将这些后台作业添加到 apache 的 crontab 中应该没问题:
crontab -u apache -e
内容:
MAILTO=cron@localhost
* * * * * echo "..." | mail -s "crontest" cron@localhost
这应该每分钟给我发送一封邮件,但是却没有。当我以 apache 用户身份运行该命令时 ( sudo -s -u apache
),它工作正常,但 cronjob 从未执行。
我发现有人提到“锁定账户”这里,但我不确定建议的解决方案是否是个好主意。
答案1
我认为分钟数栏中的数字 60 是无效的(如果我错了,请纠正我)。该数字应介于 0 到 59 之间。
您实际上告诉机器要执行的操作是“echo "..." | mail -s "crontest" cron@localhost
每 60 分钟运行一次”。如果您希望作业每分钟运行一次,则该行将是:
*/1 * * * * echo "..." | mail -s "crontest" cron@localhost
http://www.cyberciti.biz/faq/how-do-i-add-jobs-to-cron-under-linux-or-unix-oses/
答案2
好的,/var/log/cron
给了我一个线索。
CROND[7709]: (apache) CMD (echo "..." | mail -s "crontest" cron@localhost)
CROND[7709]: (CRON) ERROR chdir failed (/usr/share/httpd): No such file or directory
问题是 cron 尝试切换到用户的主目录在执行任何操作之前。但是,由于我没有安装 apache,所以 /usr/share/httpd 不存在。我猜创建该目录是可行的,但使用 sudo 作为 root 应该是更好的解决方案。
* * * * * sudo -u apache env TERM=xterm php -f /var/www/owncloud/cron.php
env TERM=xterm
避免来自 cron 的警告。