Переменные среды запущенного процесса в 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
И поскольку моя работа заставляет меня быть фанатом 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