Назад | Перейти на главную страницу

выполнение crontab не имеет тех же переменных среды, что и выполняющий пользователь

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

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

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

Cron всегда работает в основном с пустым окружением. HOME, LOGNAME, и SHELL установлены; и очень ограниченный PATH. Поэтому рекомендуется использовать полные пути к исполняемым файлам и экспортировать любые переменные, которые вам нужны в вашем скрипте при использовании 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 рабочие места.

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

Cron создает свою СОБСТВЕННУЮ оболочку с указанным использованием, через которое она будет работать.

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

Или

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

У меня была аналогичная проблема на моем AWS. Я понял это так

which python3

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

а потом

. $HOME/.profile; /usr/local/bin/python3 /home/ubuntu/your_script.py