Где я могу установить переменные окружения, которые будет использовать crontab? - PullRequest
235 голосов
/ 09 февраля 2010

У меня crontab работает каждый час. Пользователь, запускающий его, имеет переменные окружения в .bash_profile, которые работают, когда пользователь запускает задание из терминала, однако, очевидно, что они не обнаруживаются crontab при запуске.

Я пытался установить их в .profile и .bashrc, но, похоже, они все еще не подобраны. Кто-нибудь знает, где я могу поместить переменные среды, которые crontab может взять?

Ответы [ 12 ]

2 голосов
/ 01 сентября 2018

Я перепробовал большинство предоставленных решений, но сначала ничего не получалось. Оказывается, однако, что это не были решения, которые не работали. Очевидно, мой ~/.bashrc файл начинается со следующего блока кода:

case $- in
    *i*) ;;
    *) return;;
esac

В основном это case statement, который проверяет текущий набор параметров в текущей оболочке, чтобы определить, что оболочка работает в интерактивном режиме. Если оболочка работает в интерактивном режиме, она переходит к поиску файла ~/.bashrc. Однако в оболочке, вызываемой cron, переменная $- не содержит значения i, которое указывает на интерактивность. Таким образом, файл ~/.bashrc никогда не получает полностью. В результате переменные среды никогда не устанавливались. Если это ваша проблема, не стесняйтесь закомментировать блок кода следующим образом и попробуйте снова:

# case $- in
#     *i*) ;;
#     *) return;;
# esac

Надеюсь, это окажется полезным

2 голосов
/ 06 марта 2015

Другой способ - вдохновленный этим этим ответом - "ввести" переменные следующий (пример fcron):

%daily 00 12 \
    set -a; \
    . /path/to/file/containing/vars; \
    set +a; \
    /path/to/script/using/vars

С help set:

-a Пометить переменные, которые были изменены или созданы для экспорта.

Использование + вместо - приводит к отключению этих флагов.

Таким образом, все, что находится между set - и set +, экспортируется в env, а затем доступно для других сценариев и т. Д. Без использования set переменные получают из источника, но живут только в set.

Кроме того, полезно также передавать переменные, когда программе требуется учетная запись без полномочий root, но вам потребуются некоторые переменные в среде этого другого пользователя. Ниже приведен пример передачи в nullmailer vars для форматирования заголовка электронной почты:

su -s /bin/bash -c "set -a; \
                    . /path/to/nullmailer-vars; \
                    set +a; \
                    /usr/sbin/logcheck" logcheck
...