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

Comment recharger /etc/environment sans redémarrer ?

/etc/environment est officiellement le bon endroit pour les variables d'environnement du système. Mais comment puis-je recharger les assignations dans ce fichier sans redémarrer ou relancer ?

Il est intéressant de noter que Google ne m'aide pas ici, à part les dizaines de billets de blog suggérant d'utiliser

source /etc/environment

qui ne fonctionneront évidemment jamais car /etc/environment est une liste d'assignations (une par ligne) et pas un script exécutable (d'où les commandes export manquantes dans /etc/environment …).

Réponses (2)

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

Une chose sur laquelle vous vous trompez est que /etc/environment nécessite un redémarrage pour se recharger. C'est faux. La seule fois où le fichier est lu est à la connexion, lorsque la pile PAM est activée - plus précisément pam_env.so, qui lit le fichier.

La connexion et la déconnexion appliqueraient les changements - et en fait vous doit le faire si vous voulez que tous vos processus reçoivent le nouvel environnement. Toutes les autres “solutions "2 n'appliqueront l'environnement qu'au processus single shell, mais pas à tout ce que vous lancez via l'interface graphique, y compris les nouvelles fenêtres de terminal.1

Si cela vous convient, cependant - l'absence de commandes export peut être compensée avec set -a et set +a. Cependant, cela reste un mauvais moyen, car le fichier n'utilise pas non plus de citation. Mais cela devrait bien fonctionner :

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

1 Le gestionnaire de session GNOME permet de modifier son propre environnement, mais seulement pendant la phase Initialization :

$ 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 n'est pas une solution, mais peut être utilisé parfois. Vous devez le joindre aux processus d'exécution de votre gestionnaire de session (par exemple gnome-session), de votre gestionnaire de fenêtre (par exemple gnome-shell ou openbox), de votre barre de tâches/panneau le cas échéant (par exemple xfce4-panel), et généralement de tout ce qui peut faire fonctionner des choses. Pour chacun de ces processus, vous devez y attacher gdb par PID, invoquer la fonction putenv() en utilisant p, puis la détacher en utilisant 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

Notez que le débogueur met le processus en pause, vous devez donc vous attacher aux gestionnaires de fenêtres de composition uniquement depuis un autre tty (console virtuelle) ou par SSH, sinon l'écran se figerait.

En plus de cela, vous devriez également mettre à jour l'environnement utilisé par dbus-daemon :

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

Pour les anciens systèmes :

$ 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

Cette réponse n'est pas aussi complète que la réponse acceptée, mais si vous avez cité des variables dans vos fichiers /etc/environment, les deux méthodes précédentes (qui utilisent export $line d'une manière ou d'une autre) se tromperont et vous vous retrouverez avec des valeurs citées.

  • Option 1 : avec un fichier source temporaire

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

  • Option 2 : avec inline for (merci @tim-jones) :

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