4

Я задаю этот вопрос после королевского уничтожения коробки с Linux. Позвольте мне дать вам некоторую предысторию, чтобы вы знали, откуда я.

В настоящее время у меня есть (ну ... есть) RedHat Linux, работающий под управлением Apache с Phusion Passenger для запуска Ruby Apps под Apache. Приложение действует в качестве службы для регулярного предоставления кэшированных файлов киоскам в районе Цинциннати. Веб-приложение работало отлично, и единственной оставшейся частью было настроить задачу cron для извлечения всей информации, которая должна быть кэширована, и упаковки ее в несколько различных пакетов обновлений для обслуживания киосков. Для этого я написал скрипт на Ruby, который будет обрабатывать выборку и упаковку данных. Чтобы настроить задачу cron, я просто использовал встроенный crontab. Сценарий выглядел так:

#!/bin/bash

cd ../lib
ruby pdf_cache.rb
ruby pdf_prepare.rb
ruby rss_cache.rb
ruby nightly-pack.rb 
cd ..
chown -R www.www *

Этот скрипт был расположен в папке cron, и структура каталогов выглядела так:

.
|-- cron
|-- feeds
|-- lib
|   `-- trash
|-- logs
|-- nightly-packs
|-- pdf
|   `-- tank
|-- public
`-- tmp

и я запустил crontab -e как root со следующим содержимым:

0 3 * * * /usr/local/apache2/ruby_projects/kiosk/cron/schedule_job

Который должен выполнять сценарий каждый день в 3 часа ночи. На следующий день после составления расписания этой задачи я получил очень неприятный сюрприз. Задача cron была выполнена в корне, и я предполагаю, что большинство команд завершилось неудачно, за исключением chmod -R www.www * который изменил владение всем в системе пользователю www .

Мой вопрос Как правильно реализовать задачу cron и из какого контекста запускается задача cron? Теперь я понимаю, что мне, вероятно, не следует запускать это под учетной записью root , и я не уверен, как запустить его под учетной записью www поскольку у этого пользователя нет оболочки, и вы не можете успешно выполнить su для пользователя www .

3 ответа3

3

Еще одно предложение: добавьте -e в строку shebang для таких сценариев (например, #!/bin/bash -e). Это заставит скрипт завершиться, если какая-либо команда в нем не выполнится. Это не гарантирует, что у вас не будет никаких неприятных сюрпризов, но это не даст сценарию полностью сойти с рельсов (так сказать) и предотвратит многие виды сбоев цепной реакции.

2

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

Задачи Cron запускаются под пользователями, которые создали задачу Cron, поэтому она запускается с root .

0

Правильный способ сделать это - su - настройте свой cronjob как этот пользователь. Тогда он будет работать от имени этого пользователя. Или, в зависимости от того, какой демон cron вы используете, он может иметь шестое поле для определения пользователя.

Надеюсь это поможет. Есть и другие хаки, но вы всегда лучше справляетесь с этим.

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