Переменные среды запущенного процесса в Unix?

231

Мне нужно устранить некоторые проблемы, связанные с переменными среды в системе Unix.

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

Как я могу сделать то же самое в Unix? echoingи envcmd просто показывает значения в настоящее время, но я хочу посмотреть, какие значения использует текущий запущенный процесс.

m3rLinEz
источник
2
Несмотря на то, что / proc / <pid> / environment имеет размер 0, в нем все еще есть информация. «Это имеет больше смысла, если вы считаете его окном в ядро. Файл на самом деле не содержит никаких данных; он просто действует как указатель на то, где находится фактическая информация о процессе». [источник ]
nevets1219

Ответы:

295
cat /proc/<pid>/environ

Если вы хотите иметь pid (ы) данного исполняемого исполняемого файла, вы можете, среди ряда других возможностей, использовать pidof:

AlberT$ pidof sshd   
30690 6512 

РЕДАКТИРОВАТЬ :

Я полностью цитирую комментарии Денниса Уильямсона и Тедди, чтобы добиться более читабельного результата. Мое решение заключается в следующем:

tr '\0' '\n' < /proc/<pid>/environ
drAlberT
источник
46
Чтобы сделать его читабельным, преобразуйте нули в новые строки:cat /proc/17330/environ | tr \\0 \\n
Деннис Уильямсон
32
Я всегда делаюxargs --null --max-args=1 echo < /proc/PID/environ
Тедди
7
лучше использовать строки, это быстро. Кошка еще быстрее :-)
Nikhil Mulley
3
Вся /procфайловая система не переносима.
Даниэль Х
6
Я не понимаю, почему использование xargsдля преобразования нулей в новые строки лучше, чем использование tr. Может кто-нибудь выложить это для меня? Благодарю.
Джонатан Хартли,
61

Поскольку в этом вопросе есть тег unix, а все остальные проделали такую ​​большую работу по адресу тега linux , вы можете получить эту информацию в OS X и других системах, основанных на BSD, используя

ps -p <PID> -wwwe

или же

ps -p <PID> -wwwE

и на солярисе с

/usr/ucb/ps -wwwe <PID>

Solaris также поддерживает /procкаталог, если вы не хотите запоминать скрытую psкоманду.

Джеральд Комбс
источник
3
Я запускаю ps -p <PID> -wwwe на OS X 10.6. Я получаю список всех запущенных процессов. правильная команда с флагом -E , а не -e.
DrAlberT
1
Я тестировал на OS X 10.4, но не 10.5. Обновлен соответственно.
Джеральд Комбс
4
Это не идеально. Опция -E сообщает только о начальных переменных среды. Если переменные были изменены самим запущенным процессом (например, с помощью функции POSIX putenv ()), изменения не отражаются в выходных данных ps -p <PID> -wwE.
Кал
1
Отсутствие разнообразных процессов, не принадлежащих вам, звучит как желанная особенность. Это также относится и к использованию @ drAlberT для Linux-ориентированного ответа /proc/PID/environ. Эти файлы доступны для чтения только владельцу процесса.
Джонатан Хартли,
1
@yani Это возможно, но это намного сложнее, требует подключения отладчика к запущенному процессу. Смотрите этот ответ: unix.stackexchange.com/a/70636
Кал
25

Как уже упоминали другие, в Linux вы можете посмотреть в / proc, но есть, в зависимости от версии вашего ядра, одно или два ограничения:

Прежде всего, файл environment содержит среду, которая выглядела, когда процесс был запущен. Это означает, что любые изменения, которые процесс мог внести в свою среду, не будут видны в / proc:

$ cat /proc/$$/environ | wc -c
320
$ bash
$ cat /proc/$$/environ | wc -c
1270
$ 

Первая оболочка представляет собой оболочку входа в систему и изначально имеет очень ограниченную среду, но ее рост осуществляется путем поиска, например, .bashrc, но / proc не отражает это. Вторая оболочка с самого начала наследует более широкую среду, которую она показывает в / proc.

Кроме того, в старых ядрах содержимое файла окружения ограничено размером страницы (4 КБ):

$ cat /proc/$$/environ | wc -c
4096
$ env | wc -c
10343
$ 

Где-то между 2.6.9 (RHEL4) и 2.6.18 (RHEL5) этот предел был снят ...

Лассе
источник
1
Можно ли получить переменные окружения удаленного процесса, которые были установлены после его запуска? Я понимаю, что на VFS это показывается с / proc / self / environment, но только если мы находимся внутри процесса. Но как получить это для удаленного процесса?
GP92
11

правильное использование параметров BSD для этого (по крайней мере, в Linux):

ps e $pid

или же

ps auxe  #for all processes

и да, ps manpage довольно запутанный. ( через )

raincrumb
источник
Мой Ubuntu разбивает переменные окружения прямо в командной строке, даже если между ними нет пробела, а также усекается до одной строки в окне терминала. Я нашел ps eww $pidисправления 2-й проблемы.
user18911
1
@ user18911: У переменных env есть нулевой символьный разделитель. Другие ответы на этой странице показывают способы использования xargsили trпреобразования их в новые строки для удобства чтения. Вы, наверное, поняли это за прошедшие четыре года.
Джонатан Хартли,
7
cat /proc/PID/environ

замените PID на PID процесса, который вы хотите увидеть. Вся информация о запущенном процессе находится в каталоге / proc / PID /

пример: cat / proc / 32512 / environment

kargig
источник
7

Взято из Archlinux вики :

Вы можете создать временную функцию для разбора значений в /proc/<pid>/environ. По подсказке терминала:

envof() { sed 's/\x0/\n/g' /proc/${1}/environ; }

Затем с pid процесса, который вы хотите, просто используйте:

envof <pid>
mwotton
источник
6

Под Linux я бы попробовал взглянуть на

/proc/<pid>/environ
Joril
источник
5

Для Solaris 5.10 это работает:

pargs -e <PID>
Николай Новик
источник
5

Хотя это довольно редко документировано, содержимое /proc/<pid>/environбудет содержать только среду, которая использовалась для запуска процесса.

Если вам нужно проверить текущее состояние среды процесса, один из способов сделать это - использовать gdb.

# Start gdb by attaching it to a pid or core file
gdb <executable-file> <pid or core file>

# Run the following script to dump the environment
set variable $foo = (char **) environ
set $i = 0
while ($foo[$i] != 0)
print $foo[$i++]
end
Майкл Реннер
источник
3

И поскольку моя работа заставляет меня быть фанатом AIX, давайте не будем забывать:

ps eww [pid]

Или, как называется в справочной странице, «Стандарты Беркли».

По какой-либо причине / proc / PID / environment не существует в AIX.

Кори С.
источник
2

Если вы хотите создать форматированный envвывод переменных окружения для произвольного процесса (PID), вы можете создать удобную penv <pid>команду bash (с учетом вашей ОС) и добавить ее в свой файл .bashrc:

Linux добавьте это в ваш ~ / .bashrc:

penv () { 
    xargs --null --max-args=1 < /proc/$1/environ
}

macOS / BSD добавьте это в ваш ~ / .bashrc:

penv() {
   ps eww -o command $1  | tr ' ' '\n'
}

Солярис добавьте это в ваш ~ / .bashrc:

penv() {
   pargs -e $1
}

Использование:

$ source $ HOME / .bashrc
$ pgrep VBoxSVC
10268
$ penv 10268
SSH_CONNECTION = 1.1.1.242 53960 1.1.1.91 22
GREP_COLORS = SL = 49; 39: сх = 49; 39: т = 49; 38; 5; 167; 1: п = 49; 39; 1: п = 49; 39: Bn = 49; 39: се = 50; 39
ЛАНГ = en_US.UTF-8
EDITOR = ВИМ
XDG_SESSION_ID = 106
USER = корень
PWD = / корень
НАЧАЛО = / корень
SSH_CLIENT = 1.1.1.242 53960 22
SSH_TTY = / DEV / очки / 3
MAIL = / вар / почта / корень
СРОК = Xterm-256-цветные
SHELL = / bin / Баш
SHLVL = 1
LOGNAME = корень
DBUS_SESSION_BUS_ADDRESS = Unix: путь = / Работа / пользователь / 0 / автобус
XDG_RUNTIME_DIR = / запуска / пользователь / 0
PATH = / корень / бен: / бен: / SBIN: / USR / бен: / USR / SBIN: / USR / местные / бен: / USR / местные / SBIN :.
VBOX_LOG_FLAGS = нить
VBOX_LOG = -all + dev_vmm_backdoor.elf + dev_vmm.elf
ClearLight
источник
0

Решение для Mac, возможно, другие BSD могут быть чем-то вроде

pid=28369; ps e $pid | cut -c$(expr 1 + $(ps p $pid|tail +2|wc -c))-

Переменные среды добавляются в командную строку, это удаляет командную строку, и у нас остаются только переменные среды.

Это не идеально, потому что они разделены пространством, а не разделены НЧ

Эрик Мартино
источник
-1

/ Proc / PID / Environ

Для этого сначала нам нужно идентифицировать PID процесса. для этого вы можете использовать команду PS

Варуна
источник