Як встановити глобальні змінні середовища під час завантаження через скрипт, і чи є вони доступними для програми, яка працює перед входом?


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

Я також знайшов це, що виглядало цікавим, але воно не дуже панувало в моєму випадку.

Відповіді:


12

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

Приклад:

/etc/profile.d/somescript.sh

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

/etc/profileробить виклик, у якому буде виконуватися будь-який сценарій /etc/profile.d/, і це стосується всіх користувачів системи, включаючи root.


Ви можете щось тут. Я не хочу робити саме це, хоча сценарій не може бути розташований у каталозі / etc з причин ІА. Але я думаю, що я можу створити там симпосилання, яке вказує на мій сценарій. Але для ускладнення речей деякі змінні середовища, які встановлюються сценарієм, походять від змінних оточення, встановлених службою. Тому це може не спрацювати, оскільки змінні повинні бути встановлені до того, як сценарій служби закінчиться, але не надто рано або потрібні змінні середовища не були створені службою.
sqenixs

Напевно, я можу позбутися залежності від змінних, встановлених у сервісі. У цьому випадку я думаю, що це буде працювати, доки сценарій запускається до запуску служби. Чи знаєте ви, коли запущена оболонка для входу? Або я можу контролювати, коли оболонка входу запускається? У мене немає служби для нього в каталозі rcX.d для рівня мого запуску.
sqenixs

1

Немає способу впливати на середовище іншого існуючого процесу. Процеси впливають лише на навколишнє середовище процесів їх дитини.

Тому вам потрібно встановити ці змінні середовища у предка програми, яка їм потрібна. Замість того, щоб ваша служба окремо викликала сценарій bash для встановлення середовища та програму, попросіть службу викликати скрипт bash, який встановлює змінні середовища, а потім запустить програму.

#!/bin/bash
. /path/to/environment/variable/setter.bash
exec /path/to/application

З того, що я читав в Інтернеті, є хаки (щось пов'язане з eval у вихідному скрипті або з використанням gdb), але він може працювати. Мене не надто цікавить те, що він знаходиться у фоновому режимі, якщо я можу запускати команди в поточній "оболонці" (ви знаходитесь в оболонці під час завантаження, коли ваша служба виконується?), То це теж буде добре.
sqenixs

На жаль, я не можу запустити додаток із сервісу, оскільки існує багато різних процесів, які запускаються, і речі, налаштовані з сценарію запуску програми, і їх потрібно зберігати окремо від служби для IA.
sqenixs

@sqenixs Оболонка - це процес, як і будь-який інший. Не існує такого поняття, як "бути в оболонці". Коли ви говорите про "eval у вихідному скрипті", це протокол, коли програма (яка може не бути сценарієм оболонки) виводить визначення в синтаксисі оболонки, а сценарій оболонки інтерпретує їх. Встановлення змінних середовища за допомогою gdb може спрацювати, або це не може мати ніякого ефекту, або це може призвести до збою вашої програми; як ви могли собі уявити, використання налагоджувача у виробництві не рекомендується (і, знову ж таки, з уважної причини).
Жил 'ТАК - перестань бути злим'

Напевно, існує рішення вашої проблеми, але вам потрібно бути більш точним зі своїми вимогами. У своєму запитанні ви пишете: "Після запуску скрипту служба зателефонує іншому сценарію, який запускає програму". Тож у вас, здається, є рішення: встановіть змінні середовища всередині цього іншого сценарію. Але потім у коментарі ви пишете, що "не можете запустити заявку з сервісу". Отже, що це?
Жил 'ТАК - перестань бути злим'

можливо, зробити або налаштувати середовище / sbin / init під час завантаження. Оскільки будь-який процес є дітьми інтиту так чи інакше, дочірній процес може набути середовища. Просто думка / здогадка.
Нікхіл Маллі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.