Befehls- und Umgebungsvariablen "service"


8

Ich versuche, einen Dienst zu starten, der eine Umgebung erfordert. Variable, die auf einen bestimmten Pfad gesetzt werden soll. Ich habe diese Variable in "/etc/profile.d/" gesetzt. Wenn ich diesen Dienst jedoch mit dem serviceBefehl starte, funktioniert er nicht.

Mann Service:

service runs a System V init script in as predictable environment as possible,
removing most environment variables and with current working directory set to /.

Es scheint also, servicedass meine Variablen entfernt werden. Wie soll ich die Variablen einrichten, damit sie nicht entfernt werden? Oder sollte ich das nicht tun?

Ich könnte den Dienst manuell mit den Init-Skripten starten oder sogar den Pfad in das Skript fest codieren, aber ich möchte wissen, wie man ihn mit dem serviceBefehl verwendet.

Antworten:


4

Ab Fedora 16 werden servicenur Umgebungsvariablen akzeptiert LANGund TERMalles andere verworfen. Selbst wenn Ihr aktuelles {CentOS, RHEL} die Variablen irgendwie akzeptiert, sollten Sie auf die Zukunft vorbereitet sein, in der es nicht mehr funktioniert.

Sie müssen also das Init-Skript hart codieren und / oder die Variablen in der Daemon-Einstellungsdatei selbst einrichten.


Der Nachteil ist, dass ich jedes Mal, wenn ich die App aktualisiere, die Datei ändern muss, aber ich denke, ich muss nur ... (... nicht oft aktualisieren)
Esa Varemo

Nun, das "Update oft" ist heutzutage eine Norm. Lebe damit.
Janne Pikkarainen

6

Es wird empfohlen, Konfigurationseinstellungen in einer Konfiguration zu platzieren, in /etc/sysconfig/<servicename>der sie dann vom Init-Skript gelesen werden.

Grüße

Bram


Als weiteren Tipp in der /etc/sysconfig/<servicename>Datei können Sie Bashs sourcezum Laden von Dateien verwenden /etc/profile.d, um die Shell-Anmeldeumgebung zu imitieren.
Adam Gent

2

Von man 5 init:

   Arbeitsumgebung
       Jeder Job wird mit der Umgebung anhand der Ereignisse oder Befehle ausgeführt, mit denen er gestartet wurde. Darüber hinaus können Sie Standardeinstellungen in der definieren
       Job, der später überschrieben werden kann, und geben an, welche Umgebungsvariablen in die für den Job generierten Ereignisse exportiert werden.

       Die spezielle Umgebungsvariable UPSTART_EVENTS enthält die Liste der Ereignisse, die den Job gestartet haben. Sie ist nicht vorhanden, wenn die
       Job wurde manuell gestartet.

       Darüber hinaus werden die Pre-Stop- und Post-Stop-Skripte mit der Umgebung der Ereignisse oder Befehle ausgeführt, die den Job gestoppt haben.
       Die Umgebungsvariable UPSTART_STOP_EVENTS enthält die Liste der Ereignisse, die den Job gestoppt haben. Sie ist nicht vorhanden, wenn der Job ausgeführt wird
       wurde manuell gestoppt.

       Alle Jobs enthalten auch die Umgebungsvariablen UPSTART_JOB und UPSTART_INSTANCE, die den Namen des Jobs und der Instanz enthalten.
       Diese werden meistens vom Dienstprogramm initctl (8) verwendet, um standardmäßig auf den Job zu reagieren, von dem aus die Befehle aufgerufen werden.

       env KEY [= VALUE]
              Definiert eine Standardumgebungsvariable, deren Wert durch das Ereignis oder den Befehl, mit dem der Job gestartet wird, überschrieben werden kann.
              Wenn ´KEY = VALUE´ angegeben ist, erhält die Variable KEY den Wert VALUE. Wenn nur ´KEY´ angegeben ist, wird der Wert genommen
              aus der eigenen Umgebung des init (8) -Dämons.

       Exportschlüssel
              Exportiert dazu den Wert einer Umgebungsvariablen in die Ereignisse start (7), start (7), stopp (7) und stop (7)
              Job und auf alle daraus resultierenden Ereignisse (nicht nur auf den aktuellen Job).

Zusätzlich können Sie grep env /etc/init/*sehen, wie verwendet wird

Dies ist meine Ausgabe:

/etc/init/container-detect.conf:env container
/etc/init/container-detect.conf:env LIBVIRT_LXC_UUID
/etc/init/container-detect.conf: # soll in der Umgebung von init nach "container" suchen.
/etc/init/container-detect.conf: [-d / proc / vz] && [! -d / proc / bc] && container = openvz
/etc/init/mounted-debugfs.conf:env MOUNTPOINT = / sys / kernel / debug
/etc/init/mounted-dev.conf:env MOUNTPOINT = / dev
/etc/init/mounted-proc.conf:env MOUNTPOINT = / proc
/etc/init/mounted-tmp.conf:env MOUNTPOINT = / tmp
/etc/init/munin-node.conf:env DAEMON = / usr / sbin / munin-node
/etc/init/mysql.conf:env HOME = / etc / mysql
/etc/init/nginx.conf:env DAEMON = / usr / local / nginx / sbin / nginx
/etc/init/nginx.conf:env PID = / usr / local / nginx / logs / nginx.pid
/etc/init/procps.conf:env UPSTART_EVENTS =
/etc/init/rc.conf:env INIT_VERBOSE
/etc/init/rc-sysinit.conf:env DEFAULT_RUNLEVEL = 2
/etc/init/rc-sysinit.conf:env RUNLEVEL =
/etc/init/rc-sysinit.conf:env PREVLEVEL =
/etc/init/rc-sysinit.conf:env INIT_VERBOSE
/etc/init/wait-for-state.conf:env TIMEOUT = 30
/etc/init/wait-for-state.conf:env MANUAL_OVERRIDE = "N"
/etc/init/wait-for-state.conf:env WAIT_FOREVER = "N"
/etc/init/wait-for-state.conf:env WAIT_STATE = "gestartet"
/etc/init/wait-for-state.conf:env TARGET_GOAL = "start"

Ein ausführliches Beispiel finden Sie in einigen dieser Skripte. Hier nginx.conf:

# nginx

Beschreibung "nginx http daemon"
Autor "Philipp Klose"

Start on (Dateisystem und Netzgerät-IFACE = lo)
auf Runlevel anhalten [! 2345]

env DAEMON = / usr / local / nginx / sbin / nginx
env PID = / usr / local / nginx / logs / nginx.pid

Gabel erwarten
Respawn
Respawn-Limit 10 5
#oom nie

Pre-Start-Skript
 $ DAEMON -t
 wenn [$? -ne 0]
 dann beenden Sie $?
 fi
Skript beenden

exec $ DAEMON
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.