Змінні середовища запущеного процесу в Unix?


230

Мені потрібно усунути деякі проблеми, пов’язані зі змінними середовища в системі Unix.

У Windows я можу використовувати такий інструмент, як ProcessExplorer, щоб вибрати конкретний процес і переглянути значення кожної змінної середовища.

Як я можу виконати те саме на Unix? echoingі envcmd просто показують значення в даний час, але я хочу переглянути, які значення використовує поточний процес.


2
Незважаючи на те, що / proc / <pid> / Environment має розмір 0, все ще є інформація. "Це має більше сенсу, якщо ви думаєте про це як про вікно в ядро. Файл насправді не містить жодних даних; він просто виступає вказівником на те, де знаходиться фактична інформація про процес." [джерело ]
nevets1219

Відповіді:


295
cat /proc/<pid>/environ

Якщо ви хочете мати pid (-ів) даного запущеного виконуваного файлу, ви можете, серед ряду інших можливостей, використовувати pidof:

AlberT$ pidof sshd   
30690 6512 

Редагувати :

Я повністю цитую коментарі Денніса Вільямсона та Тедді, щоб досягти більш зручного результату. Моє рішення таке:

tr '\0' '\n' < /proc/<pid>/environ

46
Щоб зробити його читабельним, перетворіть нулі в нові рядки:cat /proc/17330/environ | tr \\0 \\n
Денніс Вільямсон,

32
Я завжди такxargs --null --max-args=1 echo < /proc/PID/environ
Тедді,

7
краще використовувати струни, її швидко. Кіт все ще швидший :-)
Nikhil Mulley

2
Вся /procфайлова система не є портативною.
Даніель Н

6
Я не розумію, чому xargsкраще конвертувати нулі в нові рядки, ніж використовувати tr. Може хтось викладе це мені? Дякую.
Джонатан Хартлі

61

Оскільки в цьому питанні є тег Unix, і всі інші виконали таку велику роботу щодо вирішення тегів Linux , ви можете отримати цю інформацію в OS X та інших системах, отриманих BSD, використовуючи

ps -p <PID> -wwwe

або

ps -p <PID> -wwwE

і на Соларіс с

/usr/ucb/ps -wwwe <PID>

Solaris також підтримує /procкаталог, якщо ви не хочете згадувати незрозумілу програму ps.


3
Я запускаю ps -p <PID> -wwwe на OS X 10.6 Я отримую список усіх запущених процесів. правильна команда - прапор -E , а не -e.
drAlberT

1
Я тестував на OS X 10.4, але не 10.5. Оновлено відповідно.
Джеральд Гребінь

4
Це не ідеально. Параметр -E повідомляє лише про початкові змінні середовища. Якщо змінні були змінені самим запущеним процесом (наприклад, за допомогою функції POSIX putenv ()), зміни не відображаються на виході ps -p <PID> -wwE.
Кал

1
Не бачити навколишніх процесів, якими ви не володієте, звучить як бажана функція. Це також стосується Linux-орієнтованої відповіді @ drAlberT /proc/PID/environ. Ці файли читаються лише власником процесу.
Джонатан Хартлі

1
@yani Це можливо, але це набагато складніше, вимагає приєднати відладчик до запущеного процесу. Дивіться цю відповідь: unix.stackexchange.com/a/70636
Кал

25

Як вже згадували інші, в 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) цю межу було знято ...


1
Чи можливо отримати змінні середовища віддаленого процесу, які були встановлені після породження процесу? Я розумію, що на VFS це показано з / proc / self / environment, але тільки якщо ми знаходимось у процесі. Але як отримати це для віддаленого процесу?
GP92

11

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

ps e $pid

або

ps auxe  #for all processes

і так, ps manpage досить заплутаний. ( через )


Мій Ubuntu розбиває змінні середовища прямо проти командного рядка, навіть не так, як пробілу між ними, а також скорочується до одного рядка у вікні терміналу. Я знайшов ps eww $pidвиправлення 2-ї проблеми.
користувач18911

1
@ user18911: env vars має нульовий роздільник символів. Інші відповіді на цій сторінці показують способи їх використання xargsабо trперетворення їх у нові рядки для читабельності. Ви, мабуть, усвідомили це за чотири роки втручання.
Джонатан Хартлі

7
cat /proc/PID/environ

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

приклад: cat / proc / 32512 / оточення


7

Взято з вікі Archlinux :

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

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

Тоді з потрібним пид процесу просто використовуйте:

envof <pid>



5

Хоча це досить мало документально підтверджено, вміст /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

А оскільки моя робота робить мене фанатом AIX, не забуваймо:

ps eww [pid]

Або, як це називає сторінка "Берклі".

З будь-якої причини / proc / PID / середовище не існує в AIX.


2

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

Linux додайте це до вашого ~ / .bashrc:

penv () { 
    xargs --null --max-args=1 < /proc/$1/environ
}

macOS / BSD додайте це до свого ~ / .bashrc:

penv() {
   ps eww -o command $1  | tr ' ' '\n'
}

Solaris додайте це до свого ~ / .bashrc:

penv() {
   pargs -e $1
}

Використання:

$ source $ HOME / .bashrc
$ pgrep VBoxSVC
10268
$ 102 пенв
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
РЕДАКТОР = vim
XDG_SESSION_ID = 106
USER = корінь
PWD = / root
ГОЛОВНА = / корінь
SSH_CLIENT = 1.1.1.242 53960 22
SSH_TTY = / dev / pts / 3
MAIL = / var / mail / root
TERM = xterm-256колор
SHELL = / bin / bash
SHLVL = 1
LOGNAME = корінь
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 = нитка tsc
VBOX_LOG = -вс + dev_vmm_backdoor.elf + dev_vmm.elf

0

Мак-рішення, ймовірно, також і інші BSD, може бути чимось подібним

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

Змінні середовища додаються до командного рядка, це видаляє командний рядок, і у нас залишилися лише змінні середовища.

Це не ідеально, оскільки вони розділені між собою простором, а не розділеними LF


-1

/ proc / PID / оточення

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.