Umgebung in nicht interaktiver Sitzung auffüllen

Umgebung in nicht interaktiver Sitzung auffüllen

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 rootBenutzer.

Ich habe einige Skripte, sowohl in /etc/init.dals 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 shals Shell.

Ich habe über verschiedene Dateien wie gelesen .bashrcund .profileeinige Variablen wie ENVund 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:

  1. Wie kann ich die Umgebung während des Bootvorgangs (also ohne Anmeldung) einstellen oder SysVinitdies auf eine angenehme Art und Weise tun lassen?
  2. Die in Skripten durchgeführten Exporte /etc/init.dwerden ü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?
  3. Ist mein Workaround eine gültige Lösung?

Antwort1

  1. 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 sourceoder .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

. . .
  1. 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?

sourceIhre 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)

. . .
  1. 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.

verwandte Informationen