Как я могу запустить команду cron с существующими переменными окружающей среды?

Как я могу запустить команду cron с существующими переменными окружающей среды?

Если я в командной строке, я могу ввести echo $ORACLE_HOME и получить путь. Это одна из моих переменных окружения, которая устанавливается в моем ~/.profile . Тем не менее, кажется, что ~/.profile не загружается fron cron-скриптами, поэтому мои скрипты терпят неудачу, потому что переменная $ORACLE_HOME не установлена.

В этом вопросе автор упоминает создание профиля ~/.cronfile который устанавливает переменные для cron, а затем делает обходной путь для загрузки всех своих команд cron в скрипты, которые он хранит в своем каталоге ~/Cron . Файл типа ~/.cronfile звучит неплохо, но остальная часть ответа кажется немного громоздкой, и я надеялся, что кто-то скажет мне более простой способ получить тот же результат.

Я полагаю, что в начале моих сценариев я мог бы добавить что-то вроде source ~/.profile но похоже, что он может быть избыточным.

Итак, как я могу заставить мои скрипты cron загружать переменные из моего профиля интерактивной оболочки?

В crontab, перед командой, добавьте . $HOME/.profile . $HOME/.profile . Например:

 0 5 * * * . $HOME/.profile; /path/to/command/to/run 

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

Другим вариантом, который мне становится легче, является запуск сценария с помощью cron и наличие среды в скрипте.

В файле crontab -e:

 SHELL=/bin/bash */1 * * * * $HOME/cron_job.sh 

В файле cron_job.sh:

 #!/bin/bash source $HOME/.bash_profile some_other_cmd 

Любая команда после источника .bash_profile будет иметь вашу среду, как если бы вы вошли в систему.

Другой вариант, который мне кажется более легким, заключается в том, чтобы запустить скрипт cron и сообщить bash для входа (следовательно, используя определения среды /etc/profile.d/... )

В файле crontab -e :

 */1 * * * * bash -l -c './cron_job.sh' */1 * * * * bash -l -c 'php -f ./cron_job.php' 

Любая команда после источника .bash_profile будет иметь вашу среду, как если бы вы вошли в систему.

Плохая идея. Общая практика заключается в том, чтобы установить все необходимые переменные среды в сценарии, который должен запускаться из задания cron.

Этот синтаксис определенно помогает вам. Я не понимаю синтаксис, но он работает. Oracle использует этот синтаксис при развертывании Oracle Configuration Manager в crontab, поэтому я считаю, что это правильное решение.

 0 5 * * * SOME_ENV_VAR=some_value some_command some_parameters 

Решение, которое сработало для меня, описано здесь .

Вы создаете сценарий оболочки, который вызывает . ~/.cronfile . ~/.cronfile , а затем делает то, что вы хотите. Этот скрипт запускается cron.

В ~/.cronfile вы указываете среду для своих заданий cron.

Да, вы можете использовать «хорошо известные обходные пути» (пара из них указана). Это еще один способ сказать, что все знают, что это дерьмово, хотя некоторые люди будут ссылаться на это как на «функцию безопасности», потому что они потратили, по меньшей мере, столько же усилий на эту неудачу, сколько у вас есть, и хотели бы, чтобы их потерянное время не было напрасным. Это эквивалент cron QWERTY-клавиатуры.

Я подозреваю, что исходная причина могла быть для производительности, так что скрипты, запускаемые раз в минуту, не тратили время на чтение rc-скриптов. Также изначально cron вообще не настраивался, поэтому по умолчанию это был единственный вариант.

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

Культура Unix терпит неудачу. В моем «скромном» мнении. 🙂

Добавить

 BASH_ENV=/home/user/.profile 

к кронтабу. См. Как гарантировать доступность $ BASH_ENV

Я кладу . ~/.dbus/session-bus/* в верхней части моего желаемого скрипта 🙂

Обычно, когда ваши задачи cron запускаются от root, вам нужно установить переменную $ HOME в свой скрипт crontab или shell.

 HOME=/absolute/path/to/your/application 

Затем просто запустите свой скрипт с относительным путем: * * * * * script.sh