Как запустить crontab как пользователь:www-data?

Моя ЛАМПА настроена на работу как user:www-data и все файлы и папки создаются с такими разрешениями.

У меня есть настройки для crontab как user@ubuntu.

Так что я делаю crontab -e и используйте эту команду:

*/5 * * * * php /var/www/public/voto_m/artisan top >/dev/null 2>&1

По сути, эта команда просто создает файл кэша в указанном месте (никаких проблем с этим), но этот файл кэша создается с пользователем: пользовательские разрешения не user:www-data разрешения.

Как сделать так, чтобы он по умолчанию создавал файл с user:www-data разрешения?
Я не могу пойти и chown каждый раз файл воссоздается.

Благодарю.

5 ответов

Решение

Вы можете написать свою запись в системе crontab /etc/crontab, который принимает дополнительный аргумент, определяющий пользователя для запуска (обычно это root, но может быть www-data).

Ваша строка станет:

*/5 * * * * www-data php /var/www/public/voto_m/artisan top >/dev/null 2>&1

Или вы можете отредактировать crontab пользовательских www-данных с помощью su:

sudo su -c "crontab -e" www-data

Вы также можете запустить crontab с помощью -u Аргумент для редактирования crontab для конкретного пользователя:

sudo crontab -u www-data -e

Для запуска crontab от имени пользователя www-data вы можете использовать следующую команду:

crontab -u www-data -e

Затем вы пишете строку, например, чтобы запускать php-файл каждые 15 минут:

*/15  *  *  *  * php -f /path_to_cron/cron.php

При сохранении, вас спросит редактор:

File Name to Write: /tmp/crontab.HMpG7V 

Сохрани его там, не беспокойся. crontab -e открывает файл в /tmp вместо фактического crontab, чтобы он мог проверить ваш новый crontab на наличие ошибок и не дать вам перезаписать ваш реальный crontab с этими ошибками. Если ошибок нет, то ваш текущий crontab будет обновлен. Если crontab -e просто пишет прямо в ваш настоящий crontab, то вы рискуете уничтожить весь ваш crontab.

Чтобы убедиться, что ваш cronjob работает, вы можете проверить логи cron. обычно в /var/log/cron.log или выполняя следующую команду:

crontab -u www-data -l

Я хотел бы добавить другой подход. Как упоминали другие люди, Ubuntu (16.04 здесь) и crontab www-data, похоже, ненадежны (возможно, это вопрос безопасности?).

Как бы то ни было, в нашей компании нам нравится, чтобы все cronjobs на сервере были легко доступны, поэтому вы ничего не пропустите. В то же время мы не хотим запускать все (что угодно!) Как root.

Поэтому мы бежим

sudo crontab -e 

Как вы обычно делаете, а затем мы указываем команду как

* * * * * /bin/su - www-data -s /bin/bash -c '/path/to/command'

Это будет выполнять /path/to/command как www-data, сохраняя cronjob в корневом файле cronjobs (и это всегда будет работать правильно). Преимущество заключается в том, что вы можете записывать лог-файлы как root (для максимальной безопасности), используя каналы.

Обратите внимание, что мы передаем нашу предпочтительную оболочку, это может быть также /bin/sh для более простой оболочки (нам просто нравятся полные возможности bash). В Www-data не указана оболочка, поэтому вы получите ошибки без нее. Обычно cron запускает задания только с /bin/sh.

Важно: у пользователя www-data нет прав на выполнение.

Итак: вам нужно su и добавить -s для запуска команды от имени пользователя www-data с оболочкой.

Пример для Ларавеля

          * * * * * su www-data -s /bin/bash -c "/path_your_project/artisan schedule:run"
Другие вопросы по тегам