Назад | Перейти на главную страницу

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

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

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

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

cat /proc/<pid>/environ

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

AlberT$ pidof sshd   
30690 6512 

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

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

tr '\0' '\n' < /proc/<pid>/environ

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

ps -p <PID> -wwwe

или

ps -p <PID> -wwwE

и на Solaris с

/usr/ucb/ps -wwwe <PID>

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

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

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

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

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

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

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

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

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

ps e $pid

или

ps auxe  #for all processes

и да, man-страница ps довольно сбивает с толку. (через)

Хотя это довольно скудно задокументировано, содержание /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
cat /proc/PID/environ

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

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

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

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

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

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

envof <pid>

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

/proc/<pid>/environ

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

pargs -e <PID>

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

ps eww [pid]

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

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

Если вы хотите создать форматированный env как вывод переменных окружения для произвольного процесса (PID), вы можете создать удобный bash penv <pid> (адаптированную для вашей ОС) и добавьте ее в свой .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:cx=49;39:mt=49;38;5;167;1:fn=49;39;1:ln=49;39:bn=49;39:se=50;39
LANG=en_US.UTF-8
EDITOR=vim
XDG_SESSION_ID=106
USER=root
PWD=/root
HOME=/root
SSH_CLIENT=1.1.1.242 53960 22
SSH_TTY=/dev/pts/3
MAIL=/var/mail/root
TERM=xterm-256color
SHELL=/bin/bash
SHLVL=1
LOGNAME=root
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/0/bus
XDG_RUNTIME_DIR=/run/user/0
PATH=/root/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:.
VBOX_LOG_FLAGS=thread tsc
VBOX_LOG=-all+dev_vmm_backdoor.e.l.f+dev_vmm.e.l.f

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

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

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

Это не идеально, потому что они разделены пробелами, а не разделены LF

/ proc / PID / Environment

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