Установка переменной окружения глобально без перезапуска Ubuntu



Я знаю, что системные переменные среды можно задать, добавив записи в



/etc/environment


Или



/etc/profile


Но для этого требуется перезагрузка системы или перезапуск X.



Можно ли установить переменную окружения в Ubuntu / Linux так, чтобы сразу же была доступна вся система без перезагрузки ОС или выхода из системы пользователя?

608   4  

4 ответов:

Эта программа perl использует gdb для изменения переменной пользователя во всех запущенных в данный момент оболочках bash на то, что задано как программа arg. Для установки новой переменной можно использовать внутренний вызов bash "set_if_not"

#!/usr/bin/perl

use strict;
use warnings;

my @pids = qx(ps -C bash -o pid=);
my $foo  = $ARGV[0];
print "changing user to $foo";
print @pids;

open( my $gdb, "|gdb" ) || die "$! gdb";
select($gdb);
$|++;
for my $pid ( @pids ) {
    print "attach $pid\n";
    sleep 1;
    print 'call bind_variable("USER","' . $foo . '",0)' . "\n";
    sleep 1;
    print "detach\n";
}

Это только работает с bash ( я только протестировал его с версией 4.1 на Ubuntu 10.04 LTS) и не изменяет среду для произвольных уже запущенных программ. Очевидно, что он должен быть запущен от имени root.

Простой ответ: Выне можете сделать это вообще .

Почему не может быть общего решения?

Вопрос " почему?- нуждается в более подробном объяснении. В Linux среда зависит от процесса. Каждая среда процесса хранится в специальной области памяти, выделенной исключительно для этого процесса.

В качестве отступления: чтобы быстро изучить среду процесса, посмотрите на /proc/<pid>/env (или попробуйте /proc/self/env для среды процесса). текущий запущенный процесс, например ваша оболочка).

Когда ("родительский") процесс запускает другой ("дочерний") процесс (через fork(2)), окружение окружение родителя копируется для создания окружения потомка. После этого между этими двумя средами нет никакой связи в стиле наследования, они полностью отделены друг от друга. Так что нет никакой "глобальной" или "главной" среды, которую мы могли бы изменить, чтобы достичь того, чего вы хотите.

Почему бы просто не изменить среда для каждого процесса всех запущенных процессов? Область памяти для среды находится в четко определенном месте (в основном прямо перед памятью, выделенной для стека), поэтому вы не можете легко расширить ее, не повреждая другие критические области памяти процесса.

Возможные полурешения для частных случаев

Тем не менее, можно представить себе несколько особых случаев, когда вы действительно могли бы достичь того, чего хотите.
  • Наиболее очевидно, если вы это сделаете "размер-нейтральные" изменения, вы могли бы мыслимо подлатать все среды всех процессов. Например, замените каждую переменную окружения USER=foo (если она присутствует) на USER=bar. Боюсь, это особый случай.

  • Если вам на самом деле не нужно менять среду всех процессов, а только класс хорошо известных, возможно, будут возможны более творческие подходы. ответить превосходство высоких технологий по - это впечатляющая демонстрация делают именно это с Баша процессы.

Вероятно, существует много других частных случаев, в которых существует возможное решение. Но, как было объяснено выше: нет решения для общего случая.

Конечно export VAR=value

Вы также можете просто source /etc/profile еще раз

Боюсь, что решение здесь разочаровывающее: не используйте переменные окружения. Вместо этого используйте файл.

Итак, вместо настройки /etc / environment с помощью:

SPECIAL_VAR='some/path/I/want/later/'

И вызывая его с помощью:

$SPECIAL_VAR

Вместо этого создайте файл в ~/.yourvars с содержанием:

SPECIAL_VAR='some/path/I/want/later/'

И источник вещь каждый раз, когда вам нужна переменная:

cd `source ~/.yourvars; echo $SPECIAL_VAR`

Взлом? Возможно. Но это работает.

Comments

    Ничего не найдено.