Переменные среды для текущего процесса в Unix?
Мне нужно устранить некоторые проблемы, связанные с переменными среды в системе Unix.
В Windows я могу использовать такой инструмент, как ProcessExplorer, для выбора конкретного процесса и просмотра значений каждой переменной среды.
Как я могу выполнить одно и то же в Unix? echoing
и env
cmd просто показывают значения в настоящее время, но я хочу посмотреть, какие значения использует текущий процесс.
13 ответов
cat /proc /<pid> /environ
Если вы хотите иметь pid (ы) заданного исполняемого исполняемого файла, вы можете, среди множества других возможностей, использовать pidof
:
AlberT $ pidof sshd
30690 6512
ИЗМЕНИТЬ
Я полностью цитирую комментарий @Teddy для достижения более читаемого результата:
xargs --null --max-args = 1 </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) этот предел был удален ...
cat /proc /PID /environ
заменить PID на PID процесса, который вы хотите видеть. Каждая информация о запущенном процессе находится в каталоге /proc /PID /
пример: cat /proc /32512 /environ
В Linux я бы попытался взглянуть на
/Proc /& л; PID > /Environ
Взято из Archlinux wiki :
Вы можете создать временную функцию для анализа значений в /proc /<pid> /environ
. В командной строке терминала:
envof () {sed 's /\ x0 /\ n /g' /proc /$ {1} /environ; }
Затем с помощью pid процесса, который вы хотите, просто используйте:
envof <pid>
Для Solaris 5.10 это работает:
pargs -e <PID>
И так как моя работа заставляет меня быть поклонником AIX, давайте не будем забывать:
ps eww [pid]
Или, как это делает справочная страница, «Стандарты Беркли».
По какой-либо причине /proc /PID /environ не существует в AIX.
Несмотря на то, что он довольно редко документирован, содержимое /proc /<pid> /environ
будет содержать только среду, которая была использована для запуска процесса.
Если вам нужно проверить текущее состояние среды процесса, один из способов сделать это - использовать gdb
.
# Запустить gdb, подключив его к файлу pid или core
gdb <исполняемый файл> <pid или файл ядра>
# Запустите следующий сценарий, чтобы сбросить окружающую среду
set variable $ foo = (char **) environ
множество $ i = 0
while ($ foo [$ i]! = 0)
print $ foo [$ i ++]
конец
Мак-решение, возможно, другие BSD также могут быть чем-то вроде
PID = 28369; ps e $ pid | cut -c $ (expr 1 + $ (ps p $ pid | tail +2 | wc -c)) -
Переменные среды добавляются в командную строку, это удаляет командную строку, и мы оставляем только переменные среды.
Это не идеально, потому что они разделены пробелом, а не разделены LF
/proc /PID /environ
для этого сначала нужно идентифицировать PID процесса. для этого вы можете использовать команду ps
Если вы хотите создать форматированный 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