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

Как перезагрузить /etc/окружение без перезагрузки?

/etc/environment является официально правильным местом для системных переменных окружения. Но как я могу reload заданий в этом файле без перезагрузки или перемещения?

Интересно, что Google не помогает мне здесь, кроме десятков постов в блоге, предлагающих использовать

source /etc/environment

, которые, очевидно, neverever work, потому что /etc/environment это список ассигентов (по одному на строку) и not исполняемого скрипта (отсюда и отсутствующие команды export в /etc/environment …).

Ответы (2)

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

Вы ошибаетесь в том, что /etc/environment требует перезагрузки для перезагрузки. Это неправильно. Единственный раз, когда файл читается, это on login, когда активирован стек PAM - а именно pam_env.so, которая читает файл.

Выход и обратно применят изменения - и на самом деле вы must делаете это, если хотите, чтобы все ваши процессы получили новое окружение. Все остальные “решения "2 будут применять окружение только к одному процессу оболочки, но не ко всему, что вы запускаете через GUI, включая новые терминальные windows.1

Если вас это устраивает - отсутствие команд export можно компенсировать с помощью set -a и set +a. Однако, это все равно остается плохим способом, так как в файле также не используется кавычки. Но это должно работать нормально:

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

1 GNOME Session Manager предоставляет способ изменения собственного окружения, но только на этапе 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 не является решением, но может использоваться иногда. Вы должны прикрепить его к запущенным процессам вашего менеджера сеансов (например, gnome-session), вашего оконного менеджера (например, gnome-shell или openbox), вашей панели задач/панели задач, если таковая имеется (например, xfce4-panel), и, вообще, всего остального, что может быть запущено. Для каждого из этих процессов, вам нужно прикрепить gdb к нему по PID, вызвать функцию putenv(), используя p, затем отсоединить, используя 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

Заметьте, что отладчик приостанавливает процесс, поэтому вы должны прикрепить к составлению оконных менеджеров только из другого tty (виртуальная консоль) или по SSH, иначе экран зависает.

В дополнение к этому, вы также должны обновить окружение, используемое dbus-daemon:

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

Для старых систем:

$ 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

Это не так исчерпывающе, как принятый ответ, но если вы процитировали переменные в /etc/environment файлах, оба предыдущих метода (которые используют export $line как-то) пойдут не так, и вы получите кавычки значений.

  • Вариант 1: с временным исходным файлом

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

  • Вариант 2: с inline for (спасибо @tim-jones):

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

Похожие вопросы

7
11
5
13
4