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

¿Cómo recargar /etc/environment sin reiniciar?

/etc/environment es oficialmente el lugar correcto para las variables ambientales del sistema. ¿Pero cómo puedo recargar las asignaciones en este archivo sin reiniciar o relotear?

Curiosamente, Google no me ayuda aquí, aparte de las docenas de entradas de blog que sugieren usar

source /etc/environment

que obviamente nunca funcionará porque /etc/environment es una lista de asignaciones (una por línea) y no un script ejecutable (de ahí los comandos export que faltan en /etc/environment …).

Respuestas (2)

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

Una cosa en la que te equivocas es que /etc/environment requiere un reinicio para recargar. Esto es incorrecto. La única vez que se lee el archivo es en el inicio de sesión, cuando se activa la pila PAM - específicamente pam_env.so, que lee el archivo.

Salir y volver a entrar aplicaría los cambios - y de hecho usted _debe hacer esto si quiere que todos sus procesos reciban el nuevo entorno. Todas las demás “soluciones "2 sólo aplicarán el entorno al proceso de shell único, pero no a nada que se lance a través de la GUI incluyendo las nuevas terminales windows.1

Si te parece bien, sin embargo - la falta de comandos export puede ser compensada con set -a y set +a. Sin embargo, sigue siendo una forma pobre, ya que el archivo tampoco utiliza las citas. Pero esto debería funcionar bien:

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

1 El Gestor de sesiones de GNOME proporciona una forma de cambiar su propio entorno, pero sólo durante la fase 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 no es una solución, pero se puede usar a veces. Debe adjuntarlo a los procesos en ejecución de su gestor de sesiones (por ejemplo, gnome-session), su gestor de ventanas (por ejemplo, gnome-shell o openbox), su barra de tareas/panel si lo hay (por ejemplo, xfce4-panel), y en general cualquier otra cosa que pueda ejecutar cosas. Para cada uno de esos procesos, necesitas adjuntarle gdb por PID, invocar la función putenv() usando p, y luego separar usando 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

Nota que el depurador pausa el proceso, por lo tanto debes adjuntar a los gestores de ventanas de composición sólo desde otra tty (consola virtual) o sobre SSH, de lo contrario la pantalla se congelaría.

Además de eso, también deberías actualizar el entorno usado por dbus-daemon:

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

Para sistemas antiguos:

$ 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

Esto no es tan comprensible como la respuesta aceptada, pero si tienes variables citadas en tus archivos /etc/environment los dos métodos anteriores (que usan export $line de alguna manera) saldrán mal y terminarás con valores citados.

  • Opción 1: con un archivo fuente temporal

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

  • Opción 2: con un for en línea (gracias @tim-jones):

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