Есть ли в Unix способ, которым один процесс может изменить переменные среды другого (при условии, что все они запускаются одним и тем же пользователем)? Общее решение было бы лучше всего, но если нет, как насчет конкретного случая, когда один из них является потомком другого?
Изменить: как насчет через GDB?
Ответы:
Через GDB:
Это довольно неприятный прием, и его, конечно, следует делать только в контексте сценария отладки.
источник
'putenv' has unknown return type; cast the call to its declared return type
:; в этих случаях вам следует изменитьputenv
звонок на это:call (int) putenv ("env_var_name=env_var_value")
Вы, вероятно, можете сделать это технически (см. Другие ответы), но это может вам не помочь.
Большинство программ ожидают, что переменные окружения не могут быть изменены извне после запуска, поэтому большинство, вероятно, просто прочитают переменные, которые им интересны, при запуске и инициализируются на основе этого. Так что изменение их впоследствии не имеет значения, поскольку программа никогда их не перечитает.
Если вы разместили это как конкретную проблему, вам, вероятно, следует использовать другой подход. Если бы это было просто из любопытства: Хороший вопрос :-).
источник
По сути, нет. Если у вас были достаточные привилегии (root или около того) и вы копались в / dev / kmem (память ядра), и вы внесли изменения в среду процесса, и если процесс действительно впоследствии повторно ссылался на переменную среды (то есть процесс еще не сделал копию env var и не использовал только эту копию), тогда, возможно, если вам повезло и умен, и ветер дул в правильном направлении, и фаза луны была правильной, возможно, вы могли бы чего-то добиться.
источник
gdb
в родительском процессе и по сценарию вносит изменения, и он работает без сбоя родительского процесса. Хорошо - вы, вероятно, сможете это сделать, но это не то, что вы собираетесь делать на регулярной основе. Поэтому для практических целей ответ остается отрицательным . Остальная часть ответа охватывает теоретически возможные и несколько непрактично выполнимые альтернативы.Цитата Джерри Пика:
Единственное, что вы можете сделать, это изменить переменную окружения дочернего процесса перед его запуском: он получает копию родительского окружения, извините.
Подробнее см. Http://www.unix.com.ua/orelly/unix/upt/ch06_02.htm .
Просто комментарий к ответу об использовании / proc. В linux / proc поддерживается, но он не работает, вы не можете изменить
/proc/${pid}/environ
файл, даже если вы root: он абсолютно доступен только для чтения.источник
Я мог бы придумать довольно надуманный способ сделать это, и он не будет работать для произвольных процессов.
Предположим, вы пишете свою собственную разделяемую библиотеку, которая реализует char * getenv. Затем вы настраиваете "LD_PRELOAD" или "LD_LIBRARY_PATH" env. vars, чтобы оба процесса запускались с предварительно загруженной общей библиотекой.
Таким образом, у вас будет практически полный контроль над кодом функции getenv. Тогда вы сможете проделывать всевозможные неприятные трюки. Ваш 'getenv' может обращаться к внешнему файлу конфигурации или сегменту SHM для получения альтернативных значений переменных env. Или вы можете выполнить поиск / замену регулярного выражения для запрошенных значений. Или ...
Я не могу придумать простой способ сделать это для произвольных запущенных процессов (даже если вы - root), кроме как переписать динамический компоновщик (ld-linux.so).
источник
Или попросите свой процесс обновить файл конфигурации для нового процесса, а затем либо:
источник
Насколько я знаю, нет. На самом деле вы пытаетесь взаимодействовать от одного процесса к другому, который вызывает один из методов IPC (общая память, семафоры, сокеты и т. Д.). Получив данные одним из этих методов, вы можете затем установить переменные среды или выполнить другие действия более напрямую.
источник
Кажется, что putenv сейчас не работает, а setenv работает. Я тестировал принятый ответ, безуспешно пытаясь установить переменную в текущей оболочке
и вариант, как это работает:
источник
Если ваш unix поддерживает файловую систему / proc, то ПРОЧИТАТЬ env тривиально - таким образом вы можете читать среду, командную строку и многие другие атрибуты любого процесса, которым вы владеете. Изменить это ... Ну, я могу придумать способ, но это ПЛОХАЯ идея.
Более общий случай ... Я не знаю, но сомневаюсь, что есть переносимый ответ.
(Отредактировано: мой первоначальный ответ предполагал, что OP хочет ПРОЧИТАТЬ env, а не изменять его)
источник
UNIX полон межпроцессного взаимодействия. Проверьте, есть ли у вашего целевого экземпляра. Dbus становится стандартом в «настольных» IPC.
Я меняю переменные окружения внутри оконного менеджера Awesome, используя awesome-client с Dbus "отправителем" кода lua.
источник
Не прямой ответ, но ... Рэймонд Чен только на днях обосновал это [на основе Windows] : -
Другими словами, любые такие средства ядра будут
Однако наиболее вероятная причина просто в том, что существует ограниченное количество вариантов использования такого средства.
источник