Я определил переменную "SHELL" в файле / etc / crontab:
[martin@martin ~]$ grep SHELL /etc/crontab
SHELL=/usr/local/bin/bash
[martin@martin ~]$ file /usr/local/bin/bash
/usr/local/bin/bash: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), dynamically linked (uses shared libs), for FreeBSD 8.0 (800107), stripped
[martin@martin ~]$
Кроме того, все мои скрипты в файле / etc / crontab запускаются под пользователем "martin". Однако /home/martin/.bash_profile (для оболочки входа в систему) и /home/martin/.bashrc (для оболочки без регистрации) содержат некоторые переменные, которые игнорируются в случае задания cron, но используются в случае, если я захожу в машину через SSH или откройте новую сессию bash. Почему cron игнорирует эти переменные? Разве cron просто не выполняет "/ usr / local / bin / bash my-script.sh" с разрешениями для пользователя "martin"?
.bashrc
есть строка, которая не позволяет ему работать в неинтерактивных оболочках.Ответы:
Вы можете найти нужный файл в верхней части скрипта или в начале задания для пользователя, выполняющего задание. Команда «source» является встроенной. Вы сделали бы то же самое, если бы вы вносили изменения в эти файлы для загрузки изменений.
или же
источник
bash
оболочку. Я добавил ответ, который может обработать случай, когда оболочкаsh
.Потому что это не интерактивная оболочка. То же самое происходит, когда вы открываете некоторые терминалы.
Посмотрите на этот вопрос: что такое файл .bashrc? | Супер пользователь
А также на этот:
В чем разница между .bashrc, .bash_profile и .environment? | Переполнение стека
Различные сценарии запускаются в зависимости от того, является ли соединение оболочкой входа в систему (или нет), интерактивной оболочкой (или нет) или обоими.
Если вы хотите сделать bashrc, вам нужно внести следующие изменения:
Источник: Bash Startup Files | Bash Справочное руководство | gnu.org
источник
Вы не сможете запустить,
source
если используетсяsh
оболочка. Это можно изменить, добавив следующую строку в ваш crontab:Вы также можете указать среду:
или вы можете использовать свой локальный,
/home/user/.bashrc
если это пользовательская работа cron (напримерcrontab -e
).Обратите внимание, что
.bash_profile
можно заменить.bashrc
, если он существует.Кредит: Как изменить оболочку cron (sh на bash)?
источник
SHELL=/bin/bash && source /home/YOUR_USER_NAME/.bash_profile && sh ....
Что-то еще, что может помешать получению вашего источника
.bashrc
из cronjob, - это любые проверки, выполняемые этим файлом для обнаружения интерактивных оболочек.Например, в Ubuntu 18.04 значение
.bashrc
по умолчанию для пользователя начинается с этого:и поэтому поиск не принесет ничего полезного, поскольку он немедленно завершится.
источник
Вы можете вызвать bash с
-l
опцией, например так:-l
Опция делает Баш в регистрационную оболочку. Таким образом, он будет читать пользователя.bash_profile
. Он не будет читать пользователя,.bashrc
если он явно не получен.bash_profile
. Это потому, что неинтерактивные оболочки не читаются автоматически.bashrc
. Но вам не нужно.bashrc
выполнять работу cron, потому что она.bashrc
предназначена для настройки вещей, полезных для интерактивной оболочки.Варианты:
Если bash находится в PATH, нет необходимости указывать абсолютный путь:
Оптимизация будет состоять в том, чтобы заменить текущую оболочку с помощью
exec
:источник
bash
действует по-разному, будь то оболочка или обычный язык программирования (например,perl
илиpython
).В соответствии с проектом, настройки
~/.bash_profile
,~/.bashrc
и т.д., для пользователей , чтобы установить вещи , когдаbash
играет роль оболочки (Войти оболочки, interractive оболочки). Подумайте о среде, в которой вы находитесьxterm
(интерактивная оболочка) илиssh
сеансах (оболочка входа в систему) или в консолях (оболочка входа в систему).С другой стороны,
bash
это также мощный язык программирования - подумайте о многих сценариях для управления службами,systemd
- который требует другого стиля работы. Например, когда разработчик пишет системный скрипт илиbash
программу, он / она не хочет автоматически получать исходный текст пользователя~/.bash_profile
. Это нормальная программа, а не оболочка. Обычная программа (включаяbash
программы) естественным образом наследует настройки от текущего рабочего средства (оболочки), но не устанавливает их.Если мы напишем программу для
cron
inbash
- это просто произойдетbash
; на самом деле, мы можем записать его вpython
илиperl
или любой другой progamming Язык- тогда мы можем иметь опцию источникиbash
«s~/.bash_profile
(читай: настройка оболочки пользователя, который как раз случается быть тот же язык вашего языка программирования):Однако что, если этот конкретный пользователь не использует в
bash
качестве своей оболочки? Он / она может использоватьzsh
,ksh
,fish
и т.д. Таким образом, эта практика будет на самом деле не работать при написании программы для общественного пользования.Таким образом, вы можете найти источник,
~/.bash_profile
если вы думаете, что это сработает. Но здесь речь идет не о том, можем ли мы получить файл, а о том, как все должно работать в системе: концепции дизайна . Вкратце: мы должны рассматриватьbash
как нечто, имеющее 2 роли: оболочку и язык программирования . Тогда все будет намного легче понять.источник
У меня возникла та же проблема при выполнении приложения узла из cron, которое использует NVM. Чтобы сделать оболочку bash для чтения файла .bashrc из cron, просто вызовите команду bash с параметром интерактивной оболочки `-l.
например:
* * * * * /bin/bash -lc '/home/user/myapp.sh restart'
Если это не сработает, попробуйте установить переменную path в crontab
источник
Мой способ справиться с этим заключался в следующем:
1) Поместить мои переменные в (конец)
~/.profile
:2) Создание Bash-скрипта для моих (ежедневных) задач cron (
~/cronDaily.sh
), содержащего мои команды плюс повторяющиеся источники~/.profle
:3) составление расписания выполнения моего сценария
crontab
для ежедневного запуска:Моя переменная не была проигнорирована, и команды были успешно выполнены.
Некоторые могут сказать, что такой интенсивный источник
~/.profile
проблематичен. В моем конкретном случае я не понимаю, почему это проблема, но я бы посоветовал создать для этого специальный файл.В общем, возможно, есть лучший путь к этому, но это то, что сработало для меня после большой боли, и это объясняет принцип, что с Bash 4.3.46 вы не можете получить файл из
crontab
.источник