выполнение crontab не имеет тех же переменных окружения, что и выполнение пользователя

20

Я запустил свою работу 0 2 */1 * * /aScript >aLog.log 2>&1в crontab как пользователь root, и, тем не менее, обнаружил, что env отличается от env пользователя root и поэтому испытывает другое поведение моих сценариев во время выполнения.

Попытка исправить - поместить команды экспорта в файлы rc.d, но все равно не появилась! Я заканчиваю тем, что помещаю команды экспорта в сам aScript .

Мой вопрос заключается в том, что есть лучший способ решить эту проблему? и почему env отсутствует, хотя он от того же пользователя 'root'? (Я модифицирую crontab, запустив crontab -e из корня)

бамбуковый
источник
8
Cron всегда работает с почти пустой средой. HOME, LOGNAME и SHELL установлены; и очень ограниченный путь. Если вы не хотите устанавливать все переменные самостоятельно, вы можете войти в sourceсвой (bash) профиль.
cyberx86
2
@ cyberx86: Почему бы не написать это в качестве ответа и получить репутацию?
user9517 поддерживает GoFundMonica
2
@Iain: репутация всегда приветствуется, но иногда кажется, что однострочный ответ на самом деле не зарабатывает репутацию. Я полностью согласен с тем, что лаконичный ответ имеет свое место, но я (возможно, неправильно) использовал комментарии в качестве «легкого выхода», когда я хотел оказать некоторую помощь, но не написал полное, подробное объяснение (это было в 1:00. ..). Тем не менее, я приму ваш совет, немного расширю его и добавлю в качестве ответа.
cyberx86
@ cyberx86: Лучше иметь правильный лайнер, чем неправильный или ничего.
user9517 поддерживает GoFundMonica

Ответы:

31

Cron всегда работает с почти пустой средой. HOME, LOGNAME и SHELL установлены; и очень ограниченный путь. Поэтому желательно использовать полные пути к исполняемым файлам и экспортировать любые переменные, которые вам нужны в вашем скрипте при использовании cron.

Есть несколько подходов, которые вы можете использовать для установки переменных окружения в cron, но все они равны установке в вашем скрипте.

Подход 1:

Установите каждую переменную, которая вам нужна, вручную в вашем скрипте.

Подход 2:

Источник вашего профиля:

. $HOME/.bash_profile(или . $HOME/.profile)

(Обычно вы обнаружите, что вышеуказанный файл будет источником других файлов (например, ~ / .bashrc -> / etc / bashrc -> /etc/profile.d/*) - если нет, вы также можете получить их.)

Подход 3:

Сохраните переменные среды в файл (запустите от имени нужного пользователя):

env > /path/to/my_env.sh

Затем импортируйте через ваш скрипт cron:

env - `cat /path/to/my_env.sh` /bin/sh

Подход 4:

В некоторых случаях вы можете установить глобальные переменные cron в /etc/default/cron. Однако существует элемент риска, так как они будут установлены для всех заданий cron.

cyberx86
источник
Подход 2 лучше всего подходит для серверов, где у вас есть важные вещи, которые не должны попадать на диск в env vars - пароли, ключи API и т. Д. Для меня это чудо, поэтому спасибо.
ар
Подход 4 работал для меня в среде докера, где механизм докера устанавливает env vars. Однако, чтобы это работало, мне нужно было сохранить свой env в точке входа в докер. Полное решение здесь: github.com/rayyanqcri/swarm-scheduler
hammady
Не могли бы вы рассказать о подходе 3 для меня? Когда я пытаюсь импортировать это, я получаюbash: SHELL=/bin/bash: No such file
KuboMD
1

Cron создает свою OWN оболочку с использованием, указанным для ее запуска.

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

Или

Лучший способ - экспортировать эти переменные в свой собственный скрипт.

Фархан
источник
1

В RedHat CentOS вы можете установить /etc/rc.d/init.d/functions PATH по умолчанию для постоянной установки. /etc/rc.d/crond вызывает функции при запуске.

user215450
источник
0

У меня была похожая проблема на моем AWS. Разобрался вот так

which python3

дал мне /usr/bin/local/python3местоположение

а потом

. $HOME/.profile; /usr/local/bin/python3 /home/ubuntu/your_script.py
Аль По
источник