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

118

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

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

*/1 * * * * php5 /var/www/web/includes/crontab/queue_process.php >> /var/www/web/includes/crontab/queue.log 2>&1
Теги:
cron
crontab

5 ответов

238
Лучший ответ

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

  • 43
    Он работает так же, когда вы используете crontab -e в качестве конкретного пользователя.
  • 0
    это не работает для меня, вы можете мне помочь :(
Показать ещё 3 комментария
32

EDIT: Обратите внимание, что этот метод не будет работать с 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
  • 0
    Это заставило бы его работать как пользователь Apache с правами www-данных?
  • 1
    Большое спасибо! Попробую это прямо сейчас.
Показать ещё 4 комментария
11

Поскольку вы используете 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 script и вашего файла журнала должны быть установлены так, чтобы пользователь www-data имел к ним доступ.

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

Вы также можете попробовать использовать 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

  • 0
    runuser не входит в Ubuntu.
  • 1
    runuser находится в последней версии Ubuntu. Есть также альтернативы runuser, как описано в этом ответе unix.stackexchange.com/questions/169441/ubuntu-runuser-command , например, su и sudo.
6

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

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

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
  • 0
    @renatoargh Вы, вероятно, работаете на RedHat. Посмотрите на этот ответ на Unix.SE.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню