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.

m3rLinEz
quelle
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
drAlberT
quelle
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.

Gerald Combs
quelle
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 ...

Lasse
quelle
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 )

Regenkrume
quelle
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

kargig
quelle
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>
mwotton
quelle
6

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

/proc/<pid>/environ
Joril
quelle
5

Unter Solaris 5.10 funktioniert Folgendes:

pargs -e <PID>
Mykola Novik
quelle
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
Michael Renner
quelle
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.

Corey S.
quelle
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
klares Licht
quelle
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

Erik Martino
quelle
-1

/ proc / PID / environ

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

varun
quelle