крон игнорирует переменные, определенные в “.bashrc” и “.bash_profile”

5 ответов

Можно получить файл, который Вы хотите наверху сценария или начало задания для пользователя, который выполняет задание. "Исходная" команда является встроенным. Вы сделали бы то же самое при создании редактирований в те файлы для загрузки изменений.

* * * * * source /home/user/.bash_profile; <command>

или

#!/bin/bash
source /home/user/.bash_profile

<commands>
78
27.01.2020, 19:33
  • 1
    Обратите внимание, что "источник" не мог бы работать, если крон не использует bash оболочка. Я добавил ответ, который может обработать случай, когда оболочка sh. –  Jonathan 03.05.2017, 10:40
  • 2
    ^, не найденный ошибкой, фиксирует –  Danny Bullis 01.02.2018, 03:33

Поскольку это не интерактивная оболочка. То же происходит при открытии некоторых терминалов.

Взгляните на этот вопрос: Каков .bashrc файл? | Суперпользователь

И также в этом:

Каково различие между .bashrc, .bash_profile, и .environment? | Переполнение стека

Различные сценарии стреляют в зависимости от того, если соединение является оболочкой входа в систему (или не), интерактивная оболочка (или не), или оба.

Если Вы захотите сделать bashrc, то необходимо будет внести это изменение:

То, когда Bash запускается нев интерактивном режиме, для выполнения сценария оболочки, например, он ищет переменный BASH_ENV в среде, разворачивает ее значение, если это появляется там и использует расширенное значение в качестве названия файла, чтобы читать и выполниться. Bash ведет себя, как будто следующая команда выполнялась:

if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi 

но значение переменной ПУТИ не используется для поиска имени файла.

Как отмечено выше, если неинтерактивная оболочка вызывается с --login опция, Bash пытается считать и выполнить команды из файлов запуска оболочки входа в систему.

Источник: файлы запуска Bash | справочник Bash | gnu.org

24
27.01.2020, 19:33
  • 1
    Поэтому, если мы установим BASH_ENV в Кроне, то сценарии удара крона получат это, потому что крон является неинтерактивным и невход в систему. –  CMCDragonkai 11.12.2015, 09:19

Вы не сможете запустить source, если используется оболочка sh. Это можно изменить, добавив следующую строку в ваш crontab:

SHELL=/bin/bash
* * * * * source "/root/.bashrc"; <command>

Вы также можете указать среду:

BASH_ENV="/root/.bashrc"
* * * * * <command>

или вы можете использовать свой локальный /home/user/.bashrc, если это пользователь задание cron (например, crontab -e).

Обратите внимание, что .bash_profile может заменить .bashrc, если он существует.

Кредит: Как изменить оболочку cron (sh на bash)?

18
27.01.2020, 19:33

У меня была такая же проблема при выполнении приложения узла из cron, использующего NVM. Чтобы заставить оболочку bash читать файл.bashrc из cron, просто вызовите команду bash с опцией интерактивной оболочки `-l.

например:* * * * * /bin/bash -lc '/home/user/myapp.sh restart'

Если это не сработает, попробуйте установить переменную пути в crontab

41 7 * * * /bin/bash -lc "PATH=$PATH:/home/user/.nvm/versions/node/v8.10.0/bin && /home/user/script.sh restart "
0
27.01.2020, 19:33

Вы можете вызвать bash с опцией -l, вот так:

* * * * * /bin/bash -l /path/to/script arg1 arg2

Опция -lделает bash оболочкой входа . Таким образом, он будет читать .bash_profileпользователя. Он не будет читать .bashrcпользователя, если только он не получен явным образом .bash_profile. Это связано с тем, что не интерактивные оболочки -не считывают .bashrcавтоматически. Но вам не нужно .bashrcдля задания cron, потому что .bashrcпредназначен для установки вещей, полезных для интерактивной оболочки.

Вариации:

Если bash указан в PATH, указывать абсолютный путь не нужно:

* * * * * bash -l /path/to/script arg1 arg2

Оптимизация может состоять в том, чтобы заменить текущую оболочку с помощьюexec:

* * * * * exec bash -l /path/to/script arg1 arg2
10
27.01.2020, 19:33

Теги

Похожие вопросы