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

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

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

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

13 ответов

Решение
cat /proc/<pid>/environ

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

AlberT$ pidof sshd   
30690 6512 

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

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

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

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

ps -p <PID> -wwwe

или же

ps -p <PID> -wwwE

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

/usr/ucb/ps -wwwe <PID>

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

Как уже упоминали другие, в 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) этот предел был снят...

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

ps e $pid

или же

ps auxe  #for all processes

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

В то время как довольно редко документировано, содержание /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

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

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

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

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

envof <pid>
cat /proc/PID/environ

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

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

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

pargs -e <PID>

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

/proc/<pid>/environ

И поскольку моя работа заставляет меня быть фанатом 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: сх =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

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

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

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

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

/ Proc/PID/ Environ

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

Другие вопросы по тегам