Ich habe meine Umgebungsvariable gesetzt mit /etc/profile
:
export VAR=/home/userhome
Dann wenn ich es tue echo $VAR
zeigt/home/userhome
Wenn ich jedoch einen Verweis auf diese Variable in die /etc/init.d/servicename
Datei lege , kann sie diese Variable nicht finden. Wenn ich laufe service servicename status
mit /etc/init.d/servicename
Datei mit folgendem Inhalt:
case "$1" in
status)
cd $VAR/dir
;;
esac
es sagt /dir: No such file or directory
Aber es funktioniert wenn ich /etc/init.d/servicename status
statt renneservice servicename status
Wie kann ich den Unix-Dienst Umgebungsvariablen anzeigen lassen?
rc
direkte Aufrufen des System 5- Skripts auf systemd-Betriebssystemen ebenfalls nicht auf diese Weise funktioniert, da alle Aufrufe des Skriptssystemctl
durch einen versteckten Hook in Aufrufe von umgewandelt werden.Antworten:
Das Problem ist
service
aberTERM
, dass alle Umgebungsvariablen entfernt werden ,PATH
undLANG
das ist eine gute Sache. Wenn Sie das Skript direkt ausführen, werden die Umgebungsvariablen durch nichts entfernt, sodass alles funktioniert.Sie möchten sich nicht auf externe Umgebungsvariablen verlassen, da die Umgebungsvariable beim Start wahrscheinlich nicht vorhanden ist und Ihr Init-System sie wahrscheinlich sowieso nicht setzt.
Wenn Sie sich dennoch auf solche Variablen verlassen möchten, geben Sie eine Datei ein und lesen Sie die Variablen aus, z. B. erstellen Sie
/etc/default/servicename
mit dem Inhalt:und entpacke es aus deinem Init-Skript, zB:
quelle
[ ... ]
ist eine Abkürzung für eine bedingte Prüfung; siehe diese Antwort .-f
ist einif
Argument, um zu prüfen, ob eine Datei existiert.&&
ist ein Kurzschlussoperator: Führen Sie den zweiten Befehl nur aus, wenn der erste mit 0 beendet wird..
Quell- oder Punktoperator: Lesen Sie Befehle aus dem Dateinamenargument und führen Sie sie aus.-z
ist einif
Argument, um nach einer Zeichenfolge mit der Länge Null zu suchen.>&2
Ausgabe an stderr senden. Siehe auch Einführung in if .-f
ist ein Teil von[
, nichtif
.[ ... ]
ist eine Abkürzung für einen bedingtentest
Befehl, siehe diese Antwort .-f
Ist eintest
Argument zu überprüfen , ob eine Datei vorhanden ist .“[
(odertest
) nur einen anderen Befehl vorstellen - alles, was Sieif
tun müssen, ist eine Aktion basierend auf dem Beendigungsstatus durchzuführen.$VAR
im Init-Skript befinden, sondern muss für ein anderes Programm verfügbar sein. 2 oder 3 Aufrufe nach dem Init-Skript. Z.B. Das init-Skript ruft den start-stop-daemon auf, der das Programm 1 (Java) aufruft und das Programm 2 aufruft, das es benötigt$VAR
. Ich habe den Trick in dieser Antwort ausprobiert, aber es scheint in meiner Situation nicht zu funktionieren. Wie kann ich sicherstellen, dass$VAR
Programm 2 verfügbar ist?In meinem Fall musste ich ein ,
RAILS_ENV
die in gesetzt wurde/etc/bash.bashrc
:export RAILS_ENV=staging
. Ich fügte hinzu$(grep RAILS_ENV /etc/bash.bashrc)
und das machte die Variable für das Skript verfügbar. Ich tat es auf diese Weise, also musste ich den Rest der Akte nicht mit einschließen.quelle
Eine hässliche Lösung, die auch funktionieren wird:
quelle