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

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

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

source /etc/environment

безусловно не работает, потому что /etc/environment список назначения (по одному в строке) и не исполняемый файл скрипт (отсюда и пропавший export команды /etc/environment ...).

30
задан fixer1234
06.11.2022 1:34 Количество просмотров материала 3416
Распечатать страницу

2 ответа

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

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

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

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

1 менеджер GNOME сессии позволяет меняйте свое окружение, но только во время 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

2gdb не является решением, но иногда может использоваться. Вы должны прикрепить его к запущенным процессам вашего менеджера сессий (например,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")
 = 0

(gdb) p putenv("BAZ=qux")
 = 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'}"
()
106
отвечен grawity 2022-11-07 09:22

Это не так полно, как принятый ответ, но если вы процитировали переменные в своем /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

5
отвечен villasv 2022-11-07 11:39

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх