Я использую cron для выполнения некоторых php-скриптов (фоновые задачи owncloud и т.д.). Мой сервер запускает nginx и PHP через php-fpm, который по умолчанию запускает процессы PHP под пользователем apache , единственным пользователем с правами записи в /var/www кроме root. Таким образом, было бы хорошо добавить следующие фоновые задания в crontab apache:

crontab -u apache -e

Содержимое:

MAILTO=cron@localhost
*  *  *  *  * echo "..." | mail -s "crontest" cron@localhost

Это должно отправлять мне письма каждую минуту, но это не так. Когда я запускаю команду как пользователь apache (sudo -s -u apache), она работает нормально, но cronjob никогда не выполняется.

Я нашел упоминание о "заблокированных учетных записях" здесь, но я не уверен, что предлагаемое решение является хорошей идеей.

2 ответа2

1

Хорошо, /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.

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/

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .