Как запустить команду cron с существующими переменными среды?
Если я в командной строке, я могу набрать echo $ORACLE_HOME
и получить путь. Это одна из моих переменных окружения, которая устанавливается в моем ~/.profile
. Тем не менее, кажется, что ~/.profile
не загружаются сценарии fron cron и поэтому мои сценарии завершаются ошибкой, потому что $ORACLE_HOME
переменная не установлена.
В этом вопросе автор упоминает о создании ~/.cronfile
профиля, который устанавливает переменные для cron, а затем делает обходной путь для загрузки всех своих команд cron в скрипты, которые он хранит в своем ~/Cron
каталоге. Подобный файл ~/.cronfile
звучит как хорошая идея, но остальная часть ответа кажется немного громоздкой, и я надеялся, что кто-нибудь подскажет мне более простой способ получить тот же результат.
Я предполагаю, что в начале моих сценариев я мог бы добавить что-то вроде этого, source ~/.profile
но, похоже, это может быть излишним.
Итак, как мне заставить мои скрипты cron загружать переменные из моего профиля интерактивной оболочки?
source ~/.profile
в программу избыточно? Программы наследуют свою среду от вызывающей программы. Если эта вызывающая программа не является вашей оболочкой, то как полученная программа получит ту среду, которая вам нужна?su -l
для настройки нормальной среды входа в систему, включая $ PATH для пользователя root или другого конкретного пользователя.Ответы:
В crontab перед командой добавьте
. $HOME/.profile
. Например:Cron
ничего не знает о вашей оболочке; он запускается системой, поэтому он имеет минимальную среду. Если ты хочешь чего-то, тебе нужно это внести в себя.источник
.
сценарий перед сценарием? (не уверен, как бы я этоman
сделал). Почему это отличается отsource
?.
является исходной командой дляsource
. Они эквивалентны внутри оболочки и их немного легче набирать, особенно внутри crontab. Чтобы получить больше информации, введитеhelp .
или выполните поиск^SHELL BUILTIN COMMANDS
на странице man для zshbuiltinsbash
или в верхней части ее.man
`. Running
Скажет вам, что команда является встроенной..profile
на.bash_profile
. Проверьте, какой.profile
файл существует в домашнем каталоге пользователя.Другой вариант, который я считаю более простым, - это запустить скрипт с помощью cron и иметь среду в скрипте.
В файле crontab -e:
В файле cron_job.sh:
Любая команда после источника .bash_profile будет иметь вашу среду, как если бы вы вошли в систему.
источник
/bin/bash
в качестве оболочки. Я продолжал задаваться вопросом, почему такие вещиcd /path/to/project; source .vars
работают, когда я набираю их вручную, но не выполняются (File not found
) при включении в cronjob. Ключевой чертой для меня была настройка,SHELL=/bin/bash
чтобы я мог использовать знакомые команды bash в каждом cronjob./bin/sh/
(оболочка cron по умолчанию, по-видимому) очень ограничивает.EnvironmentFile
сервисный центр . Жаль, что у cron нет ничего похожего.$SHELL
есть/bin/sh
,source
команда не существует. Используйте.
вместо этого.Другой вариант, который я считаю более простым, - это запустить скрипт с помощью cron и указать bash для входа (следовательно, используя
/etc/profile.d/...
определения среды)В
crontab -e
файле:Любая команда после источника
.bash_profile
будет иметь вашу среду, как если бы вы вошли в систему.источник
Плохая идея. Общая практика заключается в том, чтобы специально установить все необходимые переменные среды в сценарии, который должен запускаться из задания cron.
источник
/usr/bin/env
команду для установки переменных, а затем действовать как процесс окружения для cronjob.envdir
ум приходит и daemontools .~/.cronvars
и включить его в профиль, а также в свои скрипты cron. Я не хочу жестко кодировать переменные среды в каждом из скриптов, которые я запускаю, потому что, когда пути меняются жестко закодированными путями в каждом файле, их нелегко поддерживать. Похоже, это позволит централизованно разместить необходимые переменные и при этом не будет загружать другие переменные.Этот синтаксис определенно помогает вам. Я не понимаю синтаксис, но он работает. Oracle использует этот синтаксис при развертывании Oracle Configuration Manager в crontab, поэтому я считаю, что это правильное решение.
источник
Недавно я столкнулся со случаем, когда мне нужно было выполнить общий cronjob от имени пользователя root, но в то же время мне пришлось выполнить подкоманду от имени другого пользователя (что требовало использования среды этого пользователя). Я пошел со следующим подходом:
Важной частью является
-i
передаваемый аргумент ,sudo
который будет выполнять данную команду в отдельной оболочке входа в систему (что, в свою очередь, означает, что точечные файлы пользователя будут получены).PS: обратите внимание, что
user
столбец доступен только в/etc/crontab
и/etc/cron.d/*
файлы.источник
Решение, которое сработало для меня, описано здесь .
Вы создаете скрипт-обертку, который вызывает
. ~/.cronfile
, а затем делает то, что вам нужно. Этот скрипт запускается cron.В
~/.cronfile
вы указываете среду для ваших заданий cron.источник
Да, вы можете использовать «общеизвестные обходные пути» (несколько из которых были перечислены). Это еще один способ сказать, что все знают, что это дерьмо, хотя некоторые люди будут называть это «функцией безопасности», потому что они потратили, по крайней мере, столько же срабатываний на этот сбой, чем вы, и хотели бы думать, что их потерянное время не было напрасно. Это cron-эквивалент QWERTY-клавиатуры.
Я подозреваю, что первоначальная причина, возможно, была в производительности, так что скрипты, запускаемые раз в минуту, не тратили бы время на чтение скриптов rc. Также изначально cron вообще не был настраиваемым, так что по умолчанию был единственным вариантом.
Там нет дополнительной безопасности, потому что нет простой конфигурации или метода, чтобы cron просто использовал среду вашей интерактивной оболочки вместо того, чтобы пользователи выполняли глупую гимнастику оболочки. На современном компьютере, как правило, заметного прироста производительности нет, если у вас не выполняется огромное количество заданий в минуту.
Культура Unix провалилась. По моему "скромному" мнению. :-)
источник
Добавлять
в хронтаб. См. Как гарантировать доступность $ BASH_ENV
источник
Вместо того, чтобы устанавливать профиль, мне помогло установить
PATH
. Некоторые команды не были доступны в моих скриптах cron, так как ониPATH
разные.Установка
PATH
с путем команд помогла мне. Еще лучше, если вы можете использовать шаблон и позже подвергать детламентации,Передача переменных каждому элементу выглядит грязно.
источник
Я кладу .
~/.dbus/session-bus/*
в верхней части моего желаемого сценария :)источник