Есть ли способ читать переменные среды других процессов с помощью Perl и в среде Linux или Solaris?

В Perl мне нужно читать окружение других процессов.

  • Скрипт запущен с правами root.
  • Скрипт будет работать как в Linux, так и в Solaris.
  • Я хотел бы решение, которое в основном не зависело бы от платформы, по крайней мере, между Linux и Solaris. В Linux я могу получить ответ, изучив / env / ‹proc_id> / Environment.
  • Я бы хотел, чтобы вам не приходилось форкнуть. У меня уже есть решение, разветвляющее "/ usr / ucb / ps -auxwwwe $ pid"

Любые идеи?


person jac_no_k    schedule 06.02.2009    source источник


Ответы (6)


Для Solaris вы можете попробовать модуль procfs из CPAN. Хотя этот модуль все еще кажется довольно молодым, эта цитата звучит обнадеживающе:

Брайан Фаррелл прислал очень полезный патч, который проверяет argv и окружение процессов, отличных от текущего процесса.

Я полагаю, что это, вероятно, всего лишь начальная среда (как и файл environ в Linux), но, похоже, это то, что вы хотите?

В противном случае, хотя я вижу, вы говорите, что не хотите форкнуть, простым решением, вероятно, было бы запустить ~ 20 строк на C, чтобы создать небольшую программу, которая просто выводит среду на Solaris как точный эквивалент environ файла Linux. У меня уже есть что-то очень похожее на C. Если интересно, могу выложить.

РЕДАКТИРОВАТЬ (после чтения OpenSolaris pargs.c): буфер среды перераспределяется в Solaris при изменении среды, поэтому указатель psinfo может быть недействительным. Чтобы получить пуленепробиваемое решение, вам нужно выследить _environ. Это, вероятно, больше хлопот, чем вам нужно ... pargs -e <pid> может быть более приятной альтернативой UCB ps(1), если вы все же пойдете по пути развилки.

person Martin Carpenter    schedule 07.02.2009
comment
Чтобы быть ясным: pargs -e ‹pid› - это путь (оберните это внутри системного вызова perl) - person PaulS; 28.12.2013

В Linux похоже, что /proc/<pid>/environ psuedofiles содержат переменную окружения, переданную при создании процесса. Если у вас есть достаточное разрешение, вы можете их прочитать.

Похоже, что они не отслеживают изменения в среде процессов после запуска.

Это говорит о том, что вам придется удалить дамп памяти процессов, чтобы получить то, что вы просите.

Сложный.

person dmckee --- ex-moderator kitten    schedule 06.02.2009
comment
Файловая система Solaris / proc (Solaris 10) не включает даже исходную среду. - person Jonathan Leffler; 06.02.2009
comment
@Jonathan, посмотрите файл / proc / pid / psinfo и найдите struct psinfo из ‹procfs.h›. Поле pr_envp - это исходное окружение. - person Martin Carpenter; 07.02.2009

Пакет GNU 'binutils' включает утилиту CLI под названием strings. См. http://www.gnu.org/software/binutils/ для получения дополнительной информации.

strings /proc/pid/environ - выводит красивый список переменных окружения, очень похожих на env.

person sixerjman    schedule 21.11.2009
comment
Я также пришел сюда в поисках ответа, не относящегося к Perl Linux. /proc/$$/environ - это список KEY=value строк, разделенных нулем (я узнал об этом, задав запрос xxd /proc/$$/environ, но он, вероятно, где-то задокументирован). Вы можете превратить его во что-то более читаемое с помощью только стандартных инструментов POSIX. Просто используйте cat /proc/$$/environ | tr '\0' '\n'. - person alsuren; 05.06.2013
comment
@alsuren Спасибо. Это работает. И xxd, и использование tr для исправления вывода весьма полезны. - person Bruce Dawson; 19.06.2014

Первое, что приходит мне в голову, - это использовать GDB для подключения к рассматриваемому процессу, а затем просить GDB предоставить вам среду. Вы можете сделать это с помощью команды "show environment" в оболочке GDB.

Похоже, есть модуль Perl, который может сделать это за вас, Devel :: GDB . Я еще не пробовал, но похоже на простую задачу программирования: создать объект Devel :: GDB, подключиться к процессу, который вы хотите проверить, отправить команду «показать среду» и затем проанализировать результаты.

Я должен сказать, что ... когда решение настолько сложное, вы, вероятно, делаете что-то еще не так. Зачем вообще нужна среда для случайного процесса?

person jrockway    schedule 06.02.2009
comment
Цитата: Зачем вообще нужна среда для случайного процесса? Это часть сценария, который собирает информацию о процессах, запущенных в системе. Данные сохраняются для последующего анализа. - person jac_no_k; 06.02.2009
comment
show environment показывает среду gdb, а не процесс, к которому он прикреплен. Из руководства gdb: Распечатайте значение переменной окружения varname, которое будет передано вашей программе при запуске. Другими словами, команда show environment полезна, если вы планируете запустить программу, но бесполезна для того, чтобы рассказать вам о среде программы, к которой вы присоединяетесь. Поправьте меня, если я ошибаюсь, но мои тесты и чтение руководства предполагают, что этот ответ совершенно неверен. - person Bruce Dawson; 19.06.2014

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

person Thomas    schedule 06.02.2009

В Linux этого может быть достаточно для разрешения символической ссылки /proc/[pid]/cwd, см. procfs (5).

person Jakub Klinkovský    schedule 27.12.2014