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

Hoe kan men /etc/omgeving herladen zonder opnieuw op te starten?

/etc/environment is officieel de juiste plaats voor systeembrede omgevingsvariabelen. Maar hoe kan ik reload de opdrachten in dit bestand zonder herstarten of relogging?

Interessant genoeg helpt google me hier niet, afgezien van de tientallen blogposts die suggereren source /etc/environment

te gebruiken die uiteraard nooit zullen werken omdat /etc/environment een lijst van opdrachten is (één per regel) en niet een uitvoerbaar script (vandaar de ontbrekende export-commando’s in /etc/environment …).

Antwoorden (2)

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

Een ding dat u zich vergist is dat /etc/environment een reboot nodig heeft om te herladen. Dit is onjuist. De enige keer dat het bestand wordt gelezen is op login, wanneer de PAM stack is geactiveerd - specifiek pam_env.so, die het bestand leest.

Uitloggen en terug naar binnen zou de veranderingen toepassen - en in feite moet je _ dit doen als je wilt dat al je processen de nieuwe omgeving ontvangen. Alle andere “oplossingen "2 zullen de omgeving alleen toepassen op het single shell proces, maar niet op alles wat je lanceert via de GUI inclusief nieuwe terminalvensters.1

Als je dat echter goed vindt - het gebrek aan export commando’s kan worden gecompenseerd met set -a en set +a. Het blijft echter een slechte manier, omdat het bestand ook geen gebruik maakt van citeren. Maar dit zou prima moeten werken:

while read -r env; do export "$env"; done
  • *

1 GNOME Session Manager biedt een manier om de eigen omgeving te veranderen, maar alleen tijdens de Initialization-fase:

$ 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
  • *

2 gdb is geen oplossing, maar kan soms wel gebruikt worden. U moet het koppelen aan de lopende processen van uw sessiemanager (bijv. gnome-session), uw windowmanager (bijv. gnome-shell of openbox), uw taakbalk/paneel als die er is (bijv. xfce4-panel), en in het algemeen alles wat mogelijk is om dingen te laten draaien. Voor elk van deze processen dient u gdb aan te sluiten via PID, de putenv()-functie aan te roepen met p en vervolgens los te koppelen met q:

$ 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

Noteer dat de debugger het proces pauzeert, daarom dient u alleen aan te sluiten bij het samenstellen van window managers vanaf een andere tty (virtuele console) of over SSH, anders zou het scherm bevriezen.

,_ Daarnaast,_ dient u ook de door dbus-daemon gebruikte omgeving te updaten:

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

Voor oudere systemen:

$ gdbus call -e -d org.freedesktop.DBus \
                -o /org/freedesktop/DBus \
                -m org.freedesktop.DBus.UpdateActivationEnvironment \
                "{'FOO': 'bar', 'BAZ': 'qux'}"
()
6
6
6
2017-08-14 20:12:59 +0000

Dit is niet zo uitgebreid als het geaccepteerde antwoord, maar als je in je /etc/environment bestanden beide voorgaande methoden (die export $line gebruiken op een of andere manier) fout gaat en je eindigt met geciteerde waarden.

  • Optie 1: met een tijdelijk bronbestand

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

  • Optie 2: met inline for (bedankt @tim-jones):

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