Comando "service" e variabili di ambiente


8

Sto cercando di avviare un servizio che richiede un ambiente. variabile da impostare su un determinato percorso. Ho impostato questa variabile in "/etc/profile.d/". Tuttavia, quando avvio questo servizio utilizzando il servicecomando, non funziona.

servizio uomo:

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

Quindi sembra che servicestia rimuovendo le mie variabili. Come devo impostare le variabili per impedirne la rimozione. O è qualcosa che non dovrei fare.

Ho potuto avviare il servizio manualmente utilizzando le init-script, o anche hardcode il percorso nello script, ma mi piacerebbe sapere come usarlo con il servicecomando.

Risposte:


4

A partire da Fedora 16, serviceaccetta solo LANGe TERMvariabili d'ambiente, tutto il resto viene scartato. Quindi, anche se il tuo attuale {CentOS, RHEL} accetta le variabili in qualche modo, preparati per il futuro in cui non funzionerà più.

Quindi, la codifica rigida dello script init e / o l'impostazione delle variabili nel file delle impostazioni del demone stesso sarebbero le tue scelte.


Il rovescio della medaglia è che ogni volta che aggiorno l'app devo cambiare il file, ma immagino che devo solo ... (... non aggiornarlo spesso)
Esa Varemo

Bene, l '"aggiornamento spesso" è una norma al giorno d'oggi. Convivici.
Janne Pikkarainen,

6

Si consiglia di inserire le impostazioni di configurazione in una configurazione in /etc/sysconfig/<servicename>cui viene quindi letto dallo script init.

Saluti

Bram


Come altro suggerimento nel /etc/sysconfig/<servicename>file è possibile utilizzare bash sourceper caricare file da /etc/profile.dimitare l'ambiente di login della shell.
Adam Gent,

2

Da man 5 init:

   Ambiente di lavoro
       Ogni lavoro viene eseguito con l'ambiente dagli eventi o dai comandi che lo hanno avviato. Inoltre, è possibile definire i valori predefiniti in
       lavoro che può essere sostituito in seguito e specificare quali variabili di ambiente vengono esportate negli eventi generati per il lavoro.

       La variabile d'ambiente speciale UPSTART_EVENTS contiene l'elenco degli eventi che hanno avviato il lavoro, non sarà presente se il file
       il lavoro è stato avviato manualmente.

       Inoltre, gli script pre-stop e post-stop vengono eseguiti con l'ambiente degli eventi o dei comandi che hanno interrotto il lavoro.
       La variabile d'ambiente UPSTART_STOP_EVENTS contiene l'elenco di eventi che hanno interrotto il lavoro, non sarà presente se il lavoro
       è stato fermato manualmente.

       Tutti i lavori contengono anche le variabili di ambiente UPSTART_JOB e UPSTART_INSTANCE, contenenti il ​​nome del lavoro e dell'istanza.
       Questi sono principalmente utilizzati dall'utilità initctl (8) per impostazione predefinita per agire sul lavoro da cui vengono chiamati i comandi.

       KEY env [= VALUE]
              Definisce una variabile di ambiente predefinita, il cui valore può essere sostituito dall'evento o dal comando che avvia il lavoro.
              Se viene specificato "KEY = VALUE", alla variabile KEY viene assegnato il valore VALUE. Se viene fornito solo "KEY", viene preso il valore
              dall'ambiente del demone init (8).

       chiave di esportazione
              Esporta il valore di una variabile d'ambiente negli eventi iniziale (7), avviato (7), di arresto (7) e di arresto (7) per questo
              lavoro e tutti gli eventi risultanti (non solo quelli relativi al lavoro corrente).

Inoltre puoi fare grep env /etc/init/*per vedere come viene utilizzato

Questa è la mia uscita:

/etc/init/container-detect.conf:env container
/etc/init/container-detect.conf:env LIBVIRT_LXC_UUID
/etc/init/container-detect.conf: # verifica il "contenitore" nell'ambiente di init.
/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 = "iniziato"
/etc/init/wait-for-state.conf:env TARGET_GOAL = "start"

E per un esempio esaustivo vedere alcuni di questi script. Qui nginx.conf:

# nginx

descrizione "demone http nginx"
autore "Philipp Klose"

start on (filesystem e net-device-up IFACE = lo)
stop on runlevel [! 2345]

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

aspettiamo forchetta
respawn
limite di rigenerazione 10 5
#oom mai

script pre-avvio
 $ DAEMON -t
 se [$? -ne 0]
 quindi esci $?
 fi
fine script

exec $ DAEMON
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.