Окружающая среда

Я написал различные сценарии для запуска приложений сервера Java, которые обычно запускаются в течение 24 часов перед тем, как их завершить (вызывая один и тот же сценарий с другим параметром).

Скрипт использует переменные среды, определенные в файле: ~/<user>.envоткуда я .bashrc,

Это прекрасно работает при вызове скрипта из командной строки, но если я хочу добавить скрипт как запись в crontab, я сталкиваюсь с проблемой, где .bashrc не читается

Мой вопрос: каков наилучший практический подход для решения этой проблемы? Я понимаю, что могу определить запись в crontab, например:

* * * * 1-5 /usr/bin/bash -c '. /home/myuser/myuser.env && /home/myuser/scripts/myscript.sh'

... но это выглядит ужасно В качестве альтернативы я мог бы источник myuser.env в начале каждого сценария, но это станет кошмаром для поддержания.

Любая помощь приветствуется.

6 ответов

Решение

На самом деле, я обнаружил довольно элегантное решение, добавив флаг '-l' (--login) в мою команду bash, в результате чего он получает исходные файлы для входа, включая.bashrc. Следовательно, моя команда crontab просто:

* * * * 1-5 /usr/bin/bash -lc '/mnt/group/core/deploy/scripts/test.sh' > /dev/null 2>&1

Я обычно обращаюсь к этому с помощью короткого скрипта cron:

#!/bin/bash
[ -r $HOME/.bashrc ] && . $HOME/.bashrc
[ -r $HOME/.profile ] && . $HOME/.profile
exec "$@"

Затем просто префикс команды в crontab с вашей оберткой:

* * * * 1-5 ~/scripts/cron-wrapper ~/scripts/myscript.sh
* * * * 1-5 ~/scripts/cron-wrapper ~/scripts/myotherscript.sh

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

Альтернативным (хотя и не обязательно лучшим) вариантом было бы добавить их в crontab root и заставить запись использовать su с дефисом, чтобы стать рассматриваемым пользователем. Затем переменные окружения будут автоматически извлечены из пользовательской среды оболочки по умолчанию в ~/.bashrc или тому подобное. например:

* * * * 1-5 su - scriptuser '/home/myuser/scripts/myscript.sh' Это запустит задание как скрипт-пользователь со всеми переменными среды правильного входа в систему. Недостатком является то, что сам скрипт-пользователь не может настроить эту работу - для этого потребуются права суперпользователя.

Решение cron-wrapper работало для меня с одной модификацией, мне нужно было заменить $HOME абсолютным путем к домашней папке пользователя, в данном случае это было:

#!/bin/bash
[ -r /root/.bashrc ] && . /root/.bashrc
[ -r /root/.profile ] && . /root/.profile
exec "$@"

Последние версии cron позволяют устанавливать произвольные переменные среды перед запуском заданий. Таким образом, вы можете добавить это в ваш crontab:

CRON = 1

Затем в вашем.bash_login сделайте что-то вроде этого:

[-n "$ CRON"] &&..bashrc

Единственное, о чем я могу думать, будет основано на:

bash -i --rcfile 'init' -c 'script'

что, вероятно, менее привлекательно.

Другие вопросы по тегам