199 votes

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 de ce fichier sans redémarrer ou se reconnecter ?

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

source /etc/environment

ce qui, évidemment, va ne travaillent jamais parce que /etc/environment est une liste d'assignations (une par ligne) et no un script exécutable (d'où le manque de export commandes dans /etc/environment ...).

142voto

James Mertz Points 390

Une chose sur laquelle vous vous trompez est que /etc/environment nécessite un redémarrage pour se recharger. Ceci est incorrect. Le seul moment où le fichier est lu est lors de la connexion lorsque la pile PAM est activée - en particulier pam_env.so qui lit le fichier.

Se déconnecter et se reconnecter appliquerait les changements - et en fait vous doit faites ceci si vous voulez que tous vos processus reçoivent le nouvel environnement . Toutes les autres "solutions" 2 n'appliquera l'environnement qu'au seul processus Shell, mais pas à tout ce que vous lancez via l'interface graphique, y compris les nouveaux terminaux Windows. 1

Si vous êtes d'accord avec ça, cependant - le manque de export Les commandes peuvent être compensées par set -a y set +a . Cependant, cela reste une mauvaise méthode, car le fichier n'utilise pas non plus les guillemets. Mais cela devrait fonctionner correctement :

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

1 Le gestionnaire de session GNOME offre un moyen de modifier son propre environnement, mais uniquement au cours de l'exécution de l'opération. Initialization phase :

$ 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 parfois être utilisée. Vous devez l'attacher aux processus en cours d'exécution de votre gestionnaire de session (par ex. gnome-session ), votre gestionnaire de fenêtres (par ex. gnome-shell o openbox ), votre barre de tâches/panneau s'il y en a un (par ex. xfce4-panel ), et généralement tout ce qui pourrait faire fonctionner des trucs. Pour chacun de ces processus, vous devez attacher gdb par PID, invoque le putenv() en utilisant p puis détachez-les 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 à partir d'un autre tty (console virtuelle) ou par SSH, sinon l'écran se figerait.

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

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

Pour les systèmes plus anciens :

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

9voto

villasv Points 191

Cette réponse n'est pas aussi complète que la réponse acceptée, mais si vous avez des variables citées dans votre fichier /etc/environment les deux méthodes précédentes (qui utilisent export $line d'une manière ou d'une autre) se trompera 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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X