Я установил свою переменную среды, используя /etc/profile
:
export VAR=/home/userhome
Тогда, если я делаю echo $VAR
это показывает/home/userhome
Но когда я помещаю ссылку на эту переменную в /etc/init.d/servicename
файл, она не может найти эту переменную. Когда я запускаю, service servicename status
используя /etc/init.d/servicename
файл со следующим содержанием:
case "$1" in
status)
cd $VAR/dir
;;
esac
это говорит /dir: No such file or directory
Но это работает, если я бегу /etc/init.d/servicename status
вместоservice servicename status
Как сделать так, чтобы сервис Unix видел переменные среды?
environment-variables
init-script
services
чередующееся
источник
источник
rc
прямой вызов сценария System 5 также не работает в операционных системах systemd, так как все вызовы сценария превращаются в вызовыsystemctl
скрытым хуком.Ответы:
Проблема состоит в том
service
Полоски все переменные окружения , ноTERM
,PATH
иLANG
что хорошо. Если вы выполняете сценарий напрямую, ничто не удаляет переменные среды, поэтому все работает.Вы не хотите полагаться на внешние переменные среды, потому что при запуске переменная среды, вероятно, отсутствует, и ваша система инициализации, вероятно, не установит ее в любом случае.
Если вы все еще хотите полагаться на такие переменные, создайте файл и прочитайте переменные из него, например, создайте
/etc/default/servicename
с содержимым:и получить его из вашего скрипта инициализации, например:
источник
[ ... ]
сокращение от условного теста; увидеть этот ответ .-f
являетсяif
аргументом , чтобы проверить, существует ли файл.&&
является оператором короткого замыкания: вторую команду следует выполнять только в том случае, если первая выходит с 0..
исходный или точечный оператор: читать и выполнять команды из аргумента имени файла.-z
являетсяif
аргументом для проверки строки нулевой длины.>&2
отправить вывод в stderr. Смотрите также Введение в if .-f
является частью[
, а неif
.[ ... ]
это условное обозначениеtest
команды; смотрите этот ответ .-f
Этоtest
аргумент, чтобы проверить, существует ли файл».[
(илиtest
) как о просто другой команде - все, чтоif
нужно, это предпринять какое-то действие в зависимости от состояния выхода.$VAR
чтобы быть в сценарии инициализации, мне нужно, чтобы это было доступно для другой программы 2 или 3 вызова вниз по течению от самого сценария. Например. Скрипт init вызывает start-stop-daemon, который вызывает программу 1 (Java), которая вызывает нужную программу 2$VAR
. Я попробовал хитрость в этом ответе, но в моей ситуации это не сработало. Как я могу гарантировать, что$VAR
это будет доступно для Программы 2?В моем случае, мне нужно было ,
RAILS_ENV
которая была установлена в/etc/bash.bashrc
:export RAILS_ENV=staging
. Я добавил,$(grep RAILS_ENV /etc/bash.bashrc)
и это сделало переменную доступной для скрипта. Я сделал это таким образом, чтобы мне не пришлось включать остальную часть файла.источник
Одно уродливое решение, которое также будет работать:
источник