Мне нужно устранить некоторые проблемы, связанные с переменными среды в системе 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