Окружающая среда
Я написал различные сценарии для запуска приложений сервера 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'
что, вероятно, менее привлекательно.