Як вказати в crontab, яким користувачем запустити скрипт? [зачинено]


176

У мене є кілька завдань, що працюють під керуванням, які працюють під коренем, але це створює певні проблеми. Наприклад, всі папки, створені в процесі цього завдання cron, знаходяться під коренем користувача та корінком групи. Як я можу змусити його працювати під www-даними користувача та груповими www-даними, щоб під час запуску скриптів зі свого веб-сайту я міг маніпулювати цими папками та файлами?

Мій сервер працює на Ubuntu.
Поточна робота Crontab:

*/1 * * * * php5 /var/www/web/includes/crontab/queue_process.php >> /var/www/web/includes/crontab/queue.log 2>&1

Відповіді:


335

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


54
Це працює так само, коли ви використовуєте crontab -eяк конкретний користувач.
kulak

7
Але чи перевірятиметься цей crontab при запуску системи або лише тоді, коли користувач увійде в систему?
Бруно Палець

11
cronв * nix системах не потрібно користувачеві входити в систему, щоб виконувати завдання, вказані в кроні даних конкретного користувача.
Майк

2
Чи встановить це також ідентифікатор групи відповідно до запиту ОП? Що робити, якщо бажана група відрізняється від основної групи користувача?
askyle

49

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

Це зробило б його запуском, оскільки відьма користувача apache - це www-data, правда?
арма

19
Зауважте, що цей метод не працюватиме crontab -e, а працює лише в тому випадку, якщо ви редагуєте /etc/crontabбезпосередньо Прочитайте коментар у верхній частині цього файлу для отримання додаткової інформації.
imgx64

5
Користувача можна вказати лише в системному кронтабі
Джеймс Рот

У мене є кілька робочих місць за графіком на системному 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користувач мав доступ до них.


Я вважав, що це має бути рівнозначно, crontab -eхоча; але ні.
цинкування

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. Існують також альтернативи виконанню, як обговорюється у цій відповіді unix.stackexchange.com/questions/169441/ubuntu-runuser-command , наприклад, sudo та sudo.
Russell E Glaue

8

Пропозиція Майка звучить як "правильний шлях". Я наткнувся на цю тему, бажаючи вказати користувача для запуску 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
Ренато Гама

@renatoargh Напевно ти працюєш на RedHat. Подивіться цю відповідь на Unix.SE.
кайзер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.