Вопрос: Переменные среды для текущего процесса в Unix?


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

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

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


193
2017-09-17 18:14


Источник


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


Ответы:


cat /proc/<pid>/environ

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

AlberT$ pidof sshd   
30690 6512 

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

Я полностью цитирую комментарий @Teddy для достижения более читаемого результата:

xargs --null --max-args=1 < /proc/<pid>/environ

249
2017-09-17 18:18



Чтобы сделать его доступным для чтения, преобразуйте нули в новые строки: cat /proc/17330/environ | tr \\0 \\n - Dennis Williamson
я всегда делаю xargs --null --max-args=1 echo < /proc/PID/environ - Teddy
лучше использовать струны, быстро. Кошка все еще быстрее :-) - Nikhil Mulley
Целый /proc файловая система не переносима. - Daniel H
Я не понимаю, почему использование xargs преобразование нулей в новые строки лучше, чем использование tr, Может кто-нибудь изложит это для меня? Благодарю. - Jonathan Hartley


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

ps -p <PID> -wwwe

или

ps -p <PID> -wwwE

и на Solaris с

/usr/ucb/ps -wwwe <PID>

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


50
2017-09-17 20:47



Я бегу ps -p <PID> -www на OS X 10.6 Я получаю список всех запущенных процессов. правильная команда с -E flag, not -e. - drAlberT
Я тестировал на OS X 10.4, но не 10.5. Соответственно обновлено. - Gerald Combs
Это не идеально. Опция -E сообщает только начальная переменные среды. Если переменные были изменены самим запущенным процессом (например, с помощью функции POSIX putenv ()), изменения не отражаются на выходе ps -p <PID> -wwE, - Kal
Не видеть env vars процессов, не принадлежащих вам, звучит как желательная функция. Это также относится к Linux-ориентированному ответу @ drAlberT, используя /proc/PID/environ, Эти файлы могут быть прочитаны только владельцем процесса. - Jonathan Hartley
@yani Это возможно, но это намного сложнее, поэтому требуется привязка отладчика к выполняемому процессу. См. Этот ответ: unix.stackexchange.com/a/70636 - Kal


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


22
2017-10-29 11:27



Можно ли получить переменные окружения удаленного процесса, которые были установлены после возникновения процесса? Я понимаю, что в VFS он отображается с помощью / proc / self / environ, но только если мы находимся внутри процесса. Но как получить это для удаленного процесса? - Jeevan Patnaik


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

ps e $pid

или

ps auxe  #for all processes

и да, ps manpage довольно запутанна. (с помощью)


10
2018-03-04 12:15



Мой Ubuntu разбивает переменные окружения прямо на командную строку, даже не так много, как пространство между ними, а также обрезается в одну строку в окне терминала. я нашел ps eww $pid исправляет вторую проблему. - user18911
@ user18911: У env vars есть разделитель нулевых символов. Другие ответы на этой странице показывают способы использования xargs или tr чтобы преобразовать их в новые строки для удобства чтения. Вероятно, вы поняли это в течение четырех лет. - Jonathan Hartley


cat /proc/PID/environ

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

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


7
2017-09-17 18:19





В Linux я бы попытался взглянуть на

/proc/<pid>/environ

6
2017-09-17 18:19





Взято из Викиреальность:

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

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

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

envof <pid>

6
2018-01-13 23:05





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

pargs -e <PID>

4
2017-08-08 10:04





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

ps eww [pid]

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

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


3
2018-01-19 15:03





Хотя это довольно редко документировано, содержание /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
2018-02-13 16:22