
Ich arbeite an einem eingebetteten Gerät, auf dem Yocto Poky als Distribution läuft.
Das Endprodukt wird mehrere Anwendungen haben, die von gestartet werden SysVinit
. Es gibt nur einen root
Benutzer.
Ich habe einige Skripte, sowohl in /etc/init.d
als auch /etc/profile.d
, die einige Umgebungsvariablen hinzufügen, die unsere Anwendungen benötigen. Das Problem, mit dem ich konfrontiert bin, ist, dass die App, wenn ich sie „von Hand“ ausführe (also eine interaktive Shell habe), einwandfrei läuft, da die Skripte in /etc/profile.d/
als Quelle verwendet wurden, aber wenn sie von ausgeführt werden SysVinit
, können sie die Umgebung (offensichtlich) nicht finden. Wir verwenden sh
als Shell.
Ich habe über verschiedene Dateien wie gelesen .bashrc
und .profile
einige Variablen wie ENV
und BASH_ENV
. Ich habe versucht, meine Variablen dort zu definieren, aber ohne Erfolg. Ein kleiner Workaround, den ich gefunden habe, besteht darin, meine Hauptanwendung in einer Login-Shell zu starten (von SysVinit
):
2:12345:once:/bin/sh -lc /usr/bin/my_app
Meine Fragen sind also:
- Wie kann ich die Umgebung während des Bootvorgangs (also ohne Anmeldung) einstellen oder
SysVinit
dies auf eine angenehme Art und Weise tun lassen? - Die in Skripten durchgeführten Exporte
/etc/init.d
werden überhaupt nicht in meine Umgebung übertragen. Das liegt vermutlich daran, dass diese Skripte in einer Subshell ausgeführt werden und nicht in der aktuellen Shell als Quelle verwendet werden (dafür wäre ein zweiter Login erforderlich). Wie kann ich also Variablen von dort exportieren? - Ist mein Workaround eine gültige Lösung?
Antwort1
- Wie kann ich die Umgebung während des Bootvorgangs (also ohne Anmeldung) festlegen oder dies auf angenehme Weise von SysVinit erledigen lassen?
Während des Bootvorgangs ist die Umgebung sauber (wird noch nicht initialisiert). Sie müssen Umgebungsvariablen über source
oder .
Befehle für sh
(wenn Ihr Dienst ein Skript ist) setzen oder es im Programm initialisieren (d. h. über eine Konfigurationsdatei).
Kleines Beispiel für den Service-Skript-Header:
#!/bin/bash
[ -f /etc/profile.d/needed.sh ] && . /etc/profile.d/needed.sh
. . .
- Die in /etc/init.d-Skripten durchgeführten Exporte werden überhaupt nicht in meine Umgebung weitergegeben, da diese Skripte in einer Subshell ausgeführt werden und nicht in der aktuellen Shell als Quelle dienen (dafür wäre ein zweiter Login erforderlich). Wie kann ich also Variablen von dort exportieren?
source
Ihre Umgebungsvariablen für Subshells oder rufen Sie Befehle mit angegebener Umgebungsvariable auf.
Kleines Beispiel für den Service-Skript-Header:
#!/bin/bash
. . .
$(BASH_ENV=/etc/profile.d/needed.sh command)
$(ENV_VAR1=value1 command)
. . .
- Ist mein Workaround eine gültige Lösung?
Wenn es Arbeit ist, ist es ein schmutziger Weg für den Dienst. Siehe 1. und 2.