Как установить глобальные переменные среды при загрузке через скрипт и сделать их доступными для приложения, которое запускается до входа в систему?

17

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

Кроме того, после запуска скрипта служба вызывает другой скрипт, который запускает приложение, которое у меня есть. Это приложение нуждается в доступе к этим переменным среды.

Система RHEL, на которой я ее запускаю, предназначена для того, чтобы пользователь никогда не входил в нее, она только загружается и запускает приложение. Я знаю, что переменные окружения для родительского процесса / оболочки на самом деле не могут быть установлены дочерней оболочкой фонового процесса.

Мне нужен способ сделать это с помощью скрипта, который вызывается моим сервисом (но не обязательно в фоновом режиме), а не путем добавления их в мой сервис (который не работал ни для меня), ни путем сохранения их в /etc/environmentили .profileили что-нибудь в этом роде.

В моем сервисе я попытался добавить переменные окружения (но не то, что я хочу сделать):

    export TEST=192.168.1.1

Я также попробовал это в моем сервисе:

    TEST=192.168.1.1
    export TEST=${TEST}

Я попытался изменить то, как мой сервис вызывает скрипт bash:

    /bin/asdf/script &

Я также попытался получить сценарий, чтобы он работал в той же оболочке (которую я получил из этого ):

    . ./bin/asdf/script
    #I'm very confused why this didn't work

Я также нашел это, которое выглядело интересным, но это действительно не удавалось в моем случае.

sqenixs
источник

Ответы:

12

Вы можете попробовать поставить скрипт для сбора переменных в /etc/profile.d/

Пример:

/etc/profile.d/somescript.sh

#!/bin/bash
TEST=$(cat /var/somefile)
export $TEST

/etc/profileвыполняет вызов, который запустит любой скрипт /etc/profile.d/, и это относится ко всем пользователям в системе, включая root.

madflojo
источник
Вы можете быть на что-то здесь. Я не хочу делать именно это, хотя сценарий не может быть расположен в каталоге / etc по причинам IA. Но я думаю, что я могу создать там символическую ссылку, которая указывает на мой сценарий. Но, чтобы усложнить ситуацию, некоторые переменные среды, которые устанавливаются сценарием, поступают из переменных среды, установленных службой. Так что это может не сработать, поскольку переменные должны быть уже установлены до того, как сценарий службы завершится, но не слишком рано, или необходимые переменные среды еще не будут созданы службой.
Квеникс
Я думаю, я могу избавиться от зависимости от переменных, установленных в сервисе. В этом случае, я думаю, это будет работать, пока скрипт запускается до запуска службы. Вы знаете, когда запускается оболочка входа? Или я могу контролировать, когда запускается оболочка входа? У меня нет службы для этого в каталоге rcX.d для моего уровня выполнения.
Квеникс
1

У процесса нет возможности повлиять на среду другого существующего процесса. Процессы влияют только на среду их дочерних процессов.

Таким образом, вы должны установить эти переменные среды в предке приложения, которое нуждается в них. Вместо того, чтобы ваш сервис отдельно вызывал скрипт bash с настройками среды и приложение, пусть ваш сервис вызывает скрипт bash, который устанавливает переменные среды, а затем запускает приложение.

#!/bin/bash
. /path/to/environment/variable/setter.bash
exec /path/to/application
Жиль "ТАК - перестань быть злым"
источник
Из того, что я прочитал в Интернете, есть хаки (что-то связанное с eval в исходном скрипте или с использованием gdb), чтобы заставить его работать. Я не слишком заинтересован в том, чтобы он был в фоновом режиме, если я могу запускать команды в текущей «оболочке» (вы находитесь в оболочке во время загрузки, когда ваша служба выполняется?), Тогда это тоже будет хорошо.
Quenixs
К сожалению, я не могу запустить приложение из службы, так как есть много разных процессов, которые запускаются и которые настраиваются из сценария запуска приложения, и они должны храниться отдельно от службы для IA.
Квеникс
@sqenixs Оболочка - это процесс, как и любой другой. Нет такой вещи как «быть в раковине». Когда вы говорите о «eval в исходном скрипте», это протокол, в котором программа (которая может не являться сценарием оболочки) печатает определения в синтаксисе оболочки, а сценарий оболочки интерпретирует их. Установка переменных среды с помощью gdb может сработать, или может не иметь никакого эффекта, или может привести к сбою вашего приложения; как вы можете себе представить, использование отладчика в рабочей среде не рекомендуется (и опять же по уважительной причине).
Жиль "ТАК - перестань быть злым"
Вероятно, есть решение вашей проблемы, но вам нужно быть более точным с вашими требованиями. В своем вопросе вы пишете «после запуска скрипта служба затем вызывает другой скрипт, который запускает приложение». Таким образом, у вас, похоже, есть решение: установить переменные среды внутри этого другого сценария. Но затем в комментарии вы пишете, что «не можете запустить приложение из сервиса». Итак, что это?
Жиль "ТАК - перестань быть злым"
возможно, создайте или настройте среду / sbin / init во время загрузки. Так как каждый процесс в любом случае является дочерним процессом init, дочерний процесс может получить окружение. Просто мысль / предположение.
Nikhil Mulley