it-swarm-ja.com

再起動せずに/ etc / environmentをリロードする方法

/etc/environment正式に システム全体の環境変数の正しい場所です。しかし、再起動や再ログインをせずに、このファイルの割り当てをIreloadとするとどうなりますか。

興味深いことに、十分な数のグーグルがここで私を助けてくれません。

source /etc/environment

/etc/environmentは割り当てのリスト(1行に1つ)であり、notは実行可能スクリプトであるため、これは明らかに動作しません(そのため、/etc/environmentexportコマンドがありません...)。

150
fgysin

間違っているのは、/etc/environmentをリロードするには再起動が必要なことです。これは間違っています。ファイルが読み込まれるのはログイン時のみです。これは、PAMスタックがアクティブになったとき、具体的にはpam_env.soで、ファイルを読み込みます。

ログアウトして再度ログインすると、変更が適用されます。実際、mustすべてのプロセスで新しい環境を受信する場合はこれを行ってください。他のすべての「ソリューション」2 環境は単一のシェルプロセスにのみ適用され、新しいターミナルウィンドウを含むGUIから起動するものには適用されません。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でアタッチし、pを使用してputenv()関数を呼び出し、次に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'}"
()
120
grawity

これは一般的な回答ほど包括的ではありませんが、/etc/environmentファイルで変数を引用符で囲んだ場合、以前の方法(export $lineを使用する方法)はどちらもうまくいかず、引用符で囲まれた値になります。

  • オプション1:一時的なソース対応ファイルを使用する

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

  • オプション2:インラインforを使う(ありがとう@ tim-jones):

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

6
villasv