
Я работаю над встраиваемым устройством, на котором в качестве дистрибутива будет использоваться 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
Итак, мои вопросы:
- Как мне настроить среду во время загрузки (т.е. без входа в систему) или
SysVinit
сделать это удобным способом? - Экспорт, выполняемый в
/etc/init.d
скриптах, вообще не распространяется на мою среду; это потому, что эти скрипты запускаются в подоболочке, а не берутся из текущей (для этого потребуется второй вход в систему). Я полагаю, так как же мне экспортировать переменные оттуда? - Является ли мой обходной путь приемлемым решением?
решение1
- Как мне настроить среду во время загрузки (т.е. без входа в систему) или позволить SysVinit сделать это, чтобы было удобнее?
Во время загрузки среда чистая (не инициализируется jet). Вам нужно поместить переменные env через source
или .
команды for sh
(если ваша служба является скриптом) или инициализировать ее в программе (т.е. через файл конфигурации).
Небольшой пример заголовка скрипта сервиса:
#!/bin/bash
[ -f /etc/profile.d/needed.sh ] && . /etc/profile.d/needed.sh
. . .
- Экспорт, выполняемый в скриптах /etc/init.d, вообще не распространяется на мою среду, потому что эти скрипты запускаются в подоболочке, а не извлекаются из текущей (для этого потребуется второй вход в систему). Как я могу экспортировать переменные оттуда?
source
ваши переменные окружения для подоболочек или вызовите команды с указанной переменной окружения.
Небольшой пример заголовка скрипта сервиса:
#!/bin/bash
. . .
$(BASH_ENV=/etc/profile.d/needed.sh command)
$(ENV_VAR1=value1 command)
. . .
- Является ли мой обходной путь приемлемым решением?
Если это работа - это грязный путь для сервиса. См. 1. и 2.