Umgebungsvariablen eines laufenden Prozesses unter Unix?


231

Ich muss einige Probleme im Zusammenhang mit Umgebungsvariablen auf einem Unix-System beheben.

Unter Windows kann ich mit einem Tool wie ProcessExplorer einen bestimmten Prozess auswählen und Werte für jede Umgebungsvariable anzeigen.

Wie kann ich dasselbe unter Unix erreichen? echoingund envcmd zeigen derzeit nur Werte an, aber ich möchte anzeigen, welche Werte der laufende Prozess derzeit verwendet.


2
Obwohl / proc / <pid> / environ eine Größe von 0 hat, sind immer noch Informationen enthalten. "Es ist sinnvoller, wenn Sie sich das als ein Fenster in den Kernel vorstellen. Die Datei enthält eigentlich keine Daten. Sie fungiert nur als Zeiger darauf, wo sich die eigentlichen Prozessinformationen befinden." [Quelle ]
nevets1219

Antworten:


295
cat /proc/<pid>/environ

Wenn Sie möchten, dass die PIDs einer bestimmten ausführbaren Datei angezeigt werden, können Sie unter anderem Folgendes verwenden pidof:

AlberT$ pidof sshd   
30690 6512 

EDIT :

Ich zitiere die Kommentare von Dennis Williamson und Teddy , um eine besser lesbare Ausgabe zu erzielen. Meine Lösung ist die folgende:

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

46
Um es lesbar zu machen, konvertieren Sie die Nullen in Zeilenumbrüche:cat /proc/17330/environ | tr \\0 \\n
Dennis Williamson

32
Das mache ich immerxargs --null --max-args=1 echo < /proc/PID/environ
Teddy

7
Verwenden Sie besser Strings, es ist schnell. Katze ist noch schneller :-)
Nikhil Mulley

3
Das gesamte /procDateisystem ist nicht portierbar.
Daniel H

6
Ich verstehe nicht, warum die Verwendung xargsvon Nullen in Zeilenumbrüche besser ist als die Verwendung von tr. Kann es mir jemand auslegen? Vielen Dank.
Jonathan Hartley

61

Da diese Frage ein Unix- Tag hat und alle anderen Linux- Tags so gut angesprochen haben , können Sie diese Informationen unter OS X und anderen BSD-abgeleiteten Systemen abrufen

ps -p <PID> -wwwe

oder

ps -p <PID> -wwwE

und auf Solaris mit

/usr/ucb/ps -wwwe <PID>

Solaris unterstützt das /procVerzeichnis auch, wenn Sie sich nicht an den psunbekannten Befehl erinnern möchten.


3
II laufen ps -p <PID> -wwwe auf OS X 10.6 ich die Liste aller laufenden Prozesse. Der richtige Befehl lautet -E flag, nicht -e.
drAlberT

1
Ich habe es unter OS X 10.4 getestet, aber nicht unter 10.5. Entsprechend aktualisiert.
Gerald Combs

4
Das ist nicht perfekt. Die Option -E gibt nur die anfänglichen Umgebungsvariablen an. Wenn die Variablen vom laufenden Prozess selbst geändert wurden (z. B. durch Verwendung der Funktion POSIX putenv ()), werden die Änderungen nicht in die Ausgabe von übernommen ps -p <PID> -wwE.
Kal

1
Es ist eine wünschenswerte Funktion, nicht alle Prozesse zu sehen, die Ihnen nicht gehören. Dies gilt auch für die Linux-orientierte Antwort von @ drAlberT unter Verwendung von /proc/PID/environ. Diese Dateien können nur vom Eigentümer des Prozesses gelesen werden.
Jonathan Hartley

1
@yani Es ist möglich, aber viel schwieriger, da ein Debugger an den laufenden Prozess angehängt werden muss. Siehe diese Antwort: unix.stackexchange.com/a/70636
Kal

25

Wie andere bereits erwähnt haben, können Sie unter Linux in / proc nachsehen, aber es gibt je nach Kernel-Version ein oder zwei Einschränkungen:

Zuallererst enthält die Umgebungsdatei die Umgebung, wie sie aussah, als der Prozess erzeugt wurde. Das bedeutet, dass Änderungen, die der Prozess möglicherweise an seiner Umgebung vorgenommen hat, in / proc nicht sichtbar sind:

$ cat /proc/$$/environ | wc -c
320
$ bash
$ cat /proc/$$/environ | wc -c
1270
$ 

Die erste Shell ist eine Login-Shell und hat anfangs eine sehr eingeschränkte Umgebung, erweitert diese jedoch durch das Sourcing von zB .bashrc, aber / proc reflektiert dies nicht. Die zweite Shell erbt von Anfang an die größere Umgebung, weshalb sie in / proc anzeigt.

Bei älteren Kerneln ist der Inhalt der Umgebungsdatei auf eine Seitengröße (4 KB) beschränkt:

$ cat /proc/$$/environ | wc -c
4096
$ env | wc -c
10343
$ 

Irgendwo zwischen 2.6.9 (RHEL4) und 2.6.18 (RHEL5) wurde dieses Limit entfernt ...


1
Ist es möglich, die Umgebungsvariablen eines Remote-Prozesses abzurufen, die festgelegt wurden, nachdem der Prozess erzeugt wurde? Ich verstehe, dass es auf VFS mit / proc / self / environ angezeigt wird, aber nur, wenn wir uns innerhalb des Prozesses befinden. Aber wie bekommt man das für einen entfernten Prozess?
GP92

11

korrekte Verwendung der BSD-Optionen, um dies zu tun (zumindest unter Linux):

ps e $pid

oder

ps auxe  #for all processes

und ja, ps manpage ist ziemlich verwirrend. ( via )


Mein Ubuntu zerschmettert die Umgebungsvariablen bis auf die Kommandozeile, ohne auch nur ein Leerzeichen dazwischen, und schneidet auch im Terminalfenster auf eine Zeile ab. Ich habe ps eww $piddas 2. Problem behoben.
User18911

1
@ user18911: Die Umgebungsvariablen haben ein Nullzeichentrennzeichen. Andere Antworten auf dieser Seite zeigen Möglichkeiten, wie Sie diese zur besseren Lesbarkeit verwenden xargsoder trin Zeilenumbrüche umwandeln können. Sie haben das wahrscheinlich in den letzten vier Jahren bemerkt.
Jonathan Hartley

7
cat /proc/PID/environ

Ersetzen Sie die PID durch die PID des Prozesses, den Sie anzeigen möchten. Alle Informationen zu einem laufenden Prozess finden Sie im Verzeichnis / proc / PID /

Beispiel: cat / proc / 32512 / environ


7

Entnommen aus dem Archlinux-Wiki :

Sie können eine temporäre Funktion erstellen, um die Werte in zu analysieren /proc/<pid>/environ. An der Eingabeaufforderung des Terminals:

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

Dann mit der PID des Prozesses, den Sie wollen, verwenden Sie einfach:

envof <pid>

6

Unter Linux würde ich versuchen, einen Blick darauf zu werfen

/proc/<pid>/environ


5

Der Inhalt von ist zwar eher spärlich dokumentiert, /proc/<pid>/environenthält jedoch nur die Umgebung, mit der der Prozess gestartet wurde.

Wenn Sie den aktuellen Status einer Prozessumgebung überprüfen müssen, können Sie dies unter Verwendung von tun 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

Und da ich aufgrund meines Jobs ein AIX-Fan bin, sollten wir Folgendes nicht vergessen:

ps eww [pid]

Oder wie die Manpage es nennt: "Berkeley Standards".

Aus irgendeinem Grund ist / proc / PID / environ in AIX nicht vorhanden.


2

Wenn Sie eine formatierte envAusgabe der Umgebungsvariablen für einen beliebigen Prozess (PID) erstellen möchten , können Sie einen bequemen bash- penv <pid>Befehl erstellen (der auf Ihr Betriebssystem zugeschnitten ist) und ihn hinzufügen .bashrc:

Linux füge dies zu deinem ~ / .bashrc hinzu:

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

macOS / BSD füge dies zu deiner ~ / .bashrc hinzu:

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

Solaris fügt dies zu Ihrer ~ / .bashrc hinzu:

penv() {
   pargs -e $1
}

Verwendungszweck:

$ 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: cx = 49; 39: mt = 49; 38; 5; 167; 1: fn = 49; 39; 1: ln = 49; 39: bn = 49; 39: se = 50; 39
LANG = de_DE.UTF-8
HERAUSGEBER = vim
XDG_SESSION_ID = 106
USER = root
PWD = / root
HOME = / root
SSH_CLIENT = 1.1.1.242 53960 22
SSH_TTY = / dev / pts / 3
MAIL = / var / mail / root
TERM = xterm-256color
SHELL = / bin / bash
SHLVL = 1
LOGNAME = root
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 = Thread tsc
VBOX_LOG = -all + dev_vmm_backdoor.elf + dev_vmm.elf

0

Eine Mac-Lösung, wahrscheinlich auch andere BSDs, könnte so ähnlich sein

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

Die Umgebungsvariablen werden an die Befehlszeile angehängt. Dadurch wird die Befehlszeile entfernt, und es bleiben nur die Umgebungsvariablen übrig.

Es ist nicht perfekt, weil sie durch Leerzeichen und nicht durch NF getrennt sind


-1

/ proc / PID / environ

Dazu müssen wir zuerst die PID des Prozesses identifizieren. Dafür können Sie den Befehl ps verwenden

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.