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

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

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

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

191 голос | спросил m3rLinEz 17 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 17 Sep 2009 22:14:24 +0400 2009, 22:14:24

13 ответов


248
cat /proc /<pid> /environ

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

AlberT $ pidof sshd
30690 6512

ИЗМЕНИТЬ

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

xargs --null --max-args = 1 </Proc /& л; PID > /Environ
ответил drAlberT 17 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 17 Sep 2009 22:18:43 +0400 2009, 22:18:43
50

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

ps -p <PID> -wwwe

или

ps -p <PID> -wwwE

и на Solaris с

/usr /ucb /ps -wwwe <PID>

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

ответил Gerald Combs 18 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 18 Sep 2009 00:47:12 +0400 2009, 00:47:12
22

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

ответил Lasse 29 +03002009-10-29T14:27:45+03:00312009bEurope/MoscowThu, 29 Oct 2009 14:27:45 +0300 2009, 14:27:45
10

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

ps e $ pid

или

ps auxe # для всех процессов

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

ответил raincrumb 4 MarpmFri, 04 Mar 2011 15:15:01 +03002011-03-04T15:15:01+03:0003 2011, 15:15:01
7
cat /proc /PID /environ

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

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

ответил kargig 17 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 17 Sep 2009 22:19:36 +0400 2009, 22:19:36
6

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

/Proc /& л; PID > /Environ
ответил Joril 17 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 17 Sep 2009 22:19:17 +0400 2009, 22:19:17
6

Взято из Archlinux wiki :

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

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

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

envof <pid>
ответил mwotton 14 Jam1000000amWed, 14 Jan 2015 02:05:03 +030015 2015, 02:05:03
4

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

pargs -e <PID>
ответил Mykola Novik 8 PM00000020000005031 2011, 14:04:50
3

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

ps eww [pid]

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

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

ответил Corey S. 19 Jpm1000000pmTue, 19 Jan 2010 18:03:39 +030010 2010, 18:03:39
3

Несмотря на то, что он довольно редко документирован, содержимое /proc /<pid> /environ будет содержать только среду, которая была использована для запуска процесса.

Если вам нужно проверить текущее состояние среды процесса, один из способов сделать это - использовать gdb.

# Запустить gdb, подключив его к файлу pid или core
gdb <исполняемый файл> <pid или файл ядра>

# Запустите следующий сценарий, чтобы сбросить окружающую среду
set variable $ foo = (char **) environ
множество $ i = 0
while ($ foo [$ i]! = 0)
print $ foo [$ i ++]
конец
ответил Michael Renner 13 FebruaryEurope/MoscowbMon, 13 Feb 2017 19:22:38 +0300000000pmMon, 13 Feb 2017 19:22:38 +030017 2017, 19:22:38
0

Мак-решение, возможно, другие BSD также могут быть чем-то вроде

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

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

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

ответил Erik Martino 22 J0000006Europe/Moscow 2016, 09:17:28
0

/proc /PID /environ

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

ответил varun 16 42017vEurope/Moscow11bEurope/MoscowThu, 16 Nov 2017 14:17:03 +0300 2017, 14:17:03
0

Если вы хотите создать форматированный env, как вывод переменных среды для произвольного процесса (PID), вы можете создать удобный bash penv <pid> (с учетом вашей ОС) и добавьте его в свой .bashrc :

Linux добавьте это в свой ~ /.bashrc:

penv () {
    xargs --null --max-args = 1 </Proc /$ 1 /окружать
}

macOS /BSD добавьте это в свой ~ /.bashrc:

penv () {
   ps eww -o команда $ 1 | tr '' '\ n'
}

Solaris добавьте это в свой ~ /.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 = поток tsc
VBOX_LOG = -all + dev_vmm_backdoor.e.l.f + dev_vmm.e.l.f
ответил clearlight 28 Jpm1000000pmSun, 28 Jan 2018 19:05:59 +030018 2018, 19:05:59

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132