Как указать в crontab каким пользователем запускать скрипт? [закрыто]

176

У меня есть несколько заданий crontab, которые запускаются под root, но это вызывает у меня некоторые проблемы. Например, все папки, созданные в процессе этого задания cron, находятся под пользователем root и группой root. Как я могу заставить его работать под пользовательскими www-данными и группировать www-данные, чтобы при запуске сценариев с моего веб-сайта я мог манипулировать этими папками и файлами?

Мой сервер работает на Ubuntu.
Текущее задание crontab:

*/1 * * * * php5 /var/www/web/includes/crontab/queue_process.php >> /var/www/web/includes/crontab/queue.log 2>&1
арма
источник

Ответы:

336

Вместо того, чтобы создавать crontab для запуска от имени пользователя root, создайте crontab для пользователя, для которого вы хотите запустить скрипт. В вашем случае crontab -u www-data -eотредактируйте crontab для пользователя www-data. Просто поместите туда свою полную команду и удалите ее из crontab пользователя root.

Майк
источник
54
Это работает так же, когда вы используете crontab -eв качестве конкретного пользователя.
Кулак
7
Но будет ли этот crontab проверяться при запуске системы или только когда пользователь входит в систему?
Бруно Фингер
11
cronв системах * nix пользователю не требуется входить в систему для запуска заданий, указанных в crontab конкретного пользователя.
Майк
2
Будет ли это также устанавливать идентификатор группы в соответствии с запросом ОП? Что если желаемая группа отличается от основной группы пользователя?
Askyle
49

РЕДАКТИРОВАТЬ: обратите внимание, что этот метод не будет работать с crontab -e, но работает, только если вы редактируете / etc / crontab напрямую. В противном случае вы можете получить ошибку вроде/bin/sh: www-data: command not found

Прямо перед названием программы:

*/1 * * * * www-data php5 /var/www/web/includes/crontab/queue_process.php >> /var/www/web/includes/crontab/queue.log 2>&1
Кристиан Новак
источник
Это заставило бы его работать как пользователь Apache с правами www-данных?
arma
19
Обратите внимание, что этот метод не будет работать crontab -e, но работает только при /etc/crontabнепосредственном редактировании . Прочитайте комментарий в верхней части этого файла для получения дополнительной информации.
imgx64
5
Пользователь может быть указан только в системном crontab
Джеймс Рот
У меня есть несколько рабочих мест по расписанию в системном crontab. Когда я это делаю sudo crontab -e, я вижу работу. Но я открываю файл /etc/crontabнет рабочих мест. Это странно? Также если я sudo crontab -eи добавлю работу с указанным пользователем, будет ли она работать?
eNeMetcH
14

Так как вы используете Ubuntu, ваш системный crontab находится по адресу /etc/crontab.

Как пользователь root (или с помощью sudo), вы можете просто отредактировать этот файл и указать пользователя, который должен выполнить эту команду. Вот формат записей в системном crontab и как вы должны ввести свою команду:

# m h dom mon dow user  command
*/1 * * * * www-data php5 /var/www/web/includes/crontab/queue_process.php >> /var/www/web/includes/crontab/queue.log 2>&1

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

pymkin
источник
Я думал, что это должно быть эквивалентно crontab -eхотя; но нет.
zinking
5
Документы Ubuntu рекомендуют не редактировать / etc / crontab, так как он может быть перезаписан обновлениями. crontab -e создаст пользовательский файл cron в / var / spool / cron / crontabs.
Хемм
9

Вы также можете попробовать использовать runuser(как root) для запуска команды от имени другого пользователя.

*/1 * * * * runuser php5 \
            --command="/var/www/web/includes/crontab/queue_process.php \
                       >> /var/www/web/includes/crontab/queue.log 2>&1"

Смотрите также: man runuser

Рассел Е Глауэ
источник
runuserне входит в Ubuntu.
Хищник
1
runuser находится в последней версии Ubuntu. Есть также альтернативы runuser, как описано в этом ответе unix.stackexchange.com/questions/169441/ubuntu-runuser-command , например, su и sudo.
Рассел E Glaue
8

Предложение Майка звучит как "правильный путь". Я натолкнулся на эту тему, желая указать пользователя для запуска vncserverпри перезагрузке, и хотел сохранить все мои задания cron в одном месте.

Я получил следующую ошибку для cron VNC:

vncserver: The USER environment variable is not set. E.g.:

В моем случае я смог sudoуказать, кому запускать задачу.

@reboot sudo -u [someone] vncserver ...
Оливер Моран
источник
1
Я получил это сообщение в журналах:sudo: sorry, you must have a tty to run sudo
Ренато Гама
@renatoargh Вы, вероятно, работаете на RedHat. Посмотрите на этот ответ на Unix.SE.
Кайзер