2011-09-25 11:27:43 +0000 2011-09-25 11:27:43 +0000
163
163

Come ricaricare /etc/ambiente senza riavviare?

/etc/environment è ufficialmente il posto giusto per le variabili ambientali a livello di sistema. Ma come posso ricaricare le assegnazioni in questo file senza riavviare o riposizionare?

È interessante notare che google non mi aiuta in questo caso, a parte le decine di post del blog che suggeriscono di usare

source /etc/environment

che ovviamente non funzioneranno mai perché /etc/environment è una lista di assegnazioni (una per riga) e non uno script eseguibile (da cui i comandi export mancanti in /etc/environment …).

Risposte (2)

126
126
126
2011-09-25 14:52:06 +0000

Una cosa su cui vi sbagliate è che /etc/environment richiede un riavvio per ricaricare. Questo non è corretto. L'unico momento in cui il file viene letto è on login, quando lo stack PAM è attivato - nello specifico pam_env.so, che legge il file.

Il logout e il back in applicherebbero le modifiche - e in effetti voi devete farlo se volete che tutti i vostri processi ricevano il nuovo ambiente. Tutte le altre “soluzioni "2 applicheranno l'ambiente solo al singolo processo di shell, ma non a tutto ciò che si lancia attraverso l'interfaccia grafica, compreso il nuovo terminale windows.1

Se questo vi va bene, però - la mancanza di comandi export può essere compensata con set -a e set +a. Tuttavia, rimane comunque un modo povero, dato che il file non usa nemmeno le virgolette. Ma questo dovrebbe funzionare bene:

while read -r env; do export "$env"; done
``` ```
$ gdbus call -e -d org.gnome.SessionManager \
                -o /org/gnome/SessionManager \
                -m org.gnome.SessionManager.Setenv \
                "FOO" "bar"
Error: GDBus.Error:org.gnome.SessionManager.NotInInitialization: Setenv
    interface is only available during the Initialization phase

1 GNOME Session Manager fornisce un modo per cambiare il proprio ambiente, ma solo durante la fase Initialization:

$ sudo gdb -p $(pidof gnome-session)
GNU gdb (GDB) 7.7.1
[...]
Attaching to process 718
[...]
0x00007fc2cefed81d in poll () from /usr/lib/libc.so.6

(gdb) p putenv("FOO=bar")
$1 = 0

(gdb) p putenv("BAZ=qux")
$2 = 0

(gdb) q
A debugging session is active.
Quit anyway? (y or n) y
Detaching from program: /usr/bin/gnome-session, process 718

2 gdb non è una soluzione, ma può essere usato a volte. Bisogna collegarlo ai processi in esecuzione del proprio gestore di sessione (ad esempio gnome-session), al gestore di finestre (ad esempio gnome-shell o openbox), alla barra delle applicazioni/pannello se presente (ad esempio xfce4-panel) e, in generale, a qualsiasi altra cosa che possa far funzionare qualcosa. Per ciascuno di questi processi, è necessario allegare gdb ad esso tramite PID, invocare la funzione putenv() usando p, quindi staccare usando q:

$ dbus-update-activation-environment --systemd FOO=bar BAZ=qux

Si noti che il debugger mette in pausa il processo, quindi è necessario allegare al compositing window manager solo da un'altra tty (console virtuale) o su SSH, altrimenti lo schermo si bloccherebbe.

_ Oltre a ciò,_ si deve anche aggiornare l'ambiente utilizzato da dbus-daemon:

$ gdbus call -e -d org.freedesktop.DBus \
                -o /org/freedesktop/DBus \
                -m org.freedesktop.DBus.UpdateActivationEnvironment \
                "{'FOO': 'bar', 'BAZ': 'qux'}"
()
``` &001 


Per i sistemi più vecchi: 


&001
6
6
6
2017-08-14 20:12:59 +0000

Questa non è così completa come la risposta accettata, ma se avete citato variabili nei vostri file /etc/environment entrambi i metodi precedenti (che usano export $line in qualche modo) andranno male e vi ritroverete con valori quotati.

  • Opzione 1: con un file sorgente temporaneo

sed 's/^/export /' /etc/environment > /tmp/env.sh && source /tmp/env.sh

  • Opzione 2: con inline for (grazie @tim-jones):

for env in $( cat /etc/environment ); do export $(echo $env | sed -e 's/"//g'); done