Есть ли способ прочитать переменные среды других процессов, используя Perl и в среде Linux или Solaris? - PullRequest
9 голосов
/ 06 февраля 2009

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

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

Есть идеи?

Ответы [ 6 ]

12 голосов
/ 06 февраля 2009

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

Они не отображаются для отслеживания изменений в среде процессов после запуска.

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

Tricky.

10 голосов
/ 22 ноября 2009

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

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

7 голосов
/ 07 февраля 2009

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

Брайан Фаррелл прислал очень полезный патч, который обрабатывает обследование аргв и среды процессов кроме текущего запущенного процесса.

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

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

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

5 голосов
/ 06 февраля 2009

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

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

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

2 голосов
/ 06 февраля 2009

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

0 голосов
/ 27 декабря 2014

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

...