Я выполнил свою работу 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