2011-12-30 6 views
22

Я знаю, что общесистемные переменные окружения могут быть установлены путем добавления записей впеременная окружения глобально без перезагрузки Ubuntu

/etc/environment 

или

/etc/profile 

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

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

+0

X рестарта достаточно, почему вы хотите сделать перезагрузку системы? – fge

+0

Ну, я не хочу перезагружать систему. В этом весь смысл. –

+1

Это означает, что вы не можете делать то, что вы просите, а затем: вам меньше всего нужно перезапустить X. Вы не можете изменить среду уже запущенного процесса. – fge

ответ

14

Эта программа Perl использует GDB, чтобы изменить переменную USER во всех запущенных Баш оболочек в любой дается как программа арг. Для того, чтобы установить новую переменную внутренний Баш вызов «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"; 
} 

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

+0

Зачем нужен корень для этого? – osgx

+2

@osgx подразумевается, что переменная должна быть изменена во всех оболочках, запущенных в системе. Чтобы изменить процессы для всех пользователей, очевидно, что нужно сделать root – Vorsprung

+0

Определенно +1! Это можно было бы упростить. 'ps -C bash -o pid =' может использоваться для исключения строки заголовка 'PID'. Затем вместо '@pids [1 .. $ # pids]' можно использовать '@ pid''. – TrueY

4

Конечно export VAR=value

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

+3

Ну, это повлияет только на оболочку, которую вы вводите в (и ее дочерние элементы), а не на другие запущенные процессы (включая X) - вам действительно нужно выйти из системы, чтобы все процессы имели ее. – fge

+3

Это установит переменную только в текущем процессе и дочерних, но не будет распространяться на другие процессы. – Marquez

16

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

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

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

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

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

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

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

Тем не менее, можно представить себе несколько специальных случаев, когда вы могли бы действительно добиться того, что вы хотите.

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

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

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

1

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

Таким образом, вместо создания/и т.д./окружающей среды с:

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

И называя его:

$SPECIAL_VAR 

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

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

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

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

A hack? Может быть. Но это работает.

-1

Выполнить эту команду в терминале

$source /etc/profile 
Смежные вопросы