Заполнить среду в неинтерактивном сеансе

Заполнить среду в неинтерактивном сеансе

Я работаю над встраиваемым устройством, на котором в качестве дистрибутива будет использоваться Yocto Poky.

Конечный продукт будет иметь несколько приложений, которые запускаются с помощью SysVinit. Пользователь только один root.

У меня есть несколько скриптов, как в , так /etc/init.dи /etc/profile.d, которые добавляют некоторые переменные окружения, необходимые нашим приложениям. Проблема, с которой я сталкиваюсь, заключается в том, что если я запускаю приложение «вручную» (то есть у меня есть интерактивная оболочка), они работают хорошо, поскольку скрипты в /etc/profile.d/были получены, но при запуске SysVinitони не могут найти заполненную среду (очевидно). Мы используем shкак оболочку.

Я читал о разных файлах, таких как .bashrc, .profileи некоторых переменных, таких как ENVи BASH_ENV. Я пытался определить свои переменные там, но безуспешно. Небольшой обходной путь, который я нашел, — это запуск моего основного приложения в оболочке входа (из SysVinit):

2:12345:once:/bin/sh -lc /usr/bin/my_app

Итак, мои вопросы:

  1. Как мне настроить среду во время загрузки (т.е. без входа в систему) или SysVinitсделать это удобным способом?
  2. Экспорт, выполняемый в /etc/init.dскриптах, вообще не распространяется на мою среду; это потому, что эти скрипты запускаются в подоболочке, а не берутся из текущей (для этого потребуется второй вход в систему). Я полагаю, так как же мне экспортировать переменные оттуда?
  3. Является ли мой обходной путь приемлемым решением?

решение1

  1. Как мне настроить среду во время загрузки (т.е. без входа в систему) или позволить SysVinit сделать это, чтобы было удобнее?

Во время загрузки среда чистая (не инициализируется jet). Вам нужно поместить переменные env через sourceили .команды for sh(если ваша служба является скриптом) или инициализировать ее в программе (т.е. через файл конфигурации).

Небольшой пример заголовка скрипта сервиса:

#!/bin/bash

[ -f /etc/profile.d/needed.sh ] && . /etc/profile.d/needed.sh

. . .
  1. Экспорт, выполняемый в скриптах /etc/init.d, вообще не распространяется на мою среду, потому что эти скрипты запускаются в подоболочке, а не извлекаются из текущей (для этого потребуется второй вход в систему). Как я могу экспортировать переменные оттуда?

sourceваши переменные окружения для подоболочек или вызовите команды с указанной переменной окружения.

Небольшой пример заголовка скрипта сервиса:

#!/bin/bash

. . .

$(BASH_ENV=/etc/profile.d/needed.sh command)
$(ENV_VAR1=value1 command)

. . .
  1. Является ли мой обходной путь приемлемым решением?

Если это работа - это грязный путь для сервиса. См. 1. и 2.

Связанный контент