Frage Umgebungsvariablen eines laufenden Prozesses unter Unix?


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

Unter Windows kann ich ein Tool wie ProcessExplorer verwenden, um einen bestimmten Prozess auszuwählen und Werte für jede Umgebungsvariable anzuzeigen.

Wie kann ich dasselbe unter Unix erreichen? echoing und env cmd zeige gerade Werte zur gegenwärtigen Zeit, aber ich möchte sehen, welche Werte der laufende Prozess gerade benutzt.


200
2017-09-17 18:14


Ursprung


Auch wenn / proc / <pid> / environ eine Größe von 0 hat, gibt es immer noch Informationen. "Es macht mehr Sinn, wenn Sie es als ein Fenster in den Kernel denken. Die Datei enthält eigentlich keine Daten; es dient nur als ein Zeiger auf, wo sich die tatsächlichen Prozessinformationen befinden." [Quelle] - nevets1219


Antworten:


cat /proc/<pid>/environ

Wenn Sie PID (s) einer laufenden ausführbaren Datei haben möchten, können Sie, neben einer Reihe anderer Möglichkeiten, auch verwenden pidof:

AlberT$ pidof sshd   
30690 6512 

BEARBEITEN:

Ich zitiere @Teddy-Kommentar vollständig, um eine besser lesbare Ausgabe zu erhalten:

xargs --null --max-args=1 < /proc/<pid>/environ

257
2017-09-17 18:18



Um es lesbar zu machen, wandeln Sie die Nullen in Zeilenumbrüche um: cat /proc/17330/environ | tr \\0 \\n - Dennis Williamson
mache ich immer xargs --null --max-args=1 echo < /proc/PID/environ - Teddy
verwende besser Strings, es ist schnell. Katze ist noch schneller :-) - Nikhil Mulley
Das Ganze /proc Dateisystem ist nicht portierbar. - Daniel H
Ich verstehe nicht warum xargsNullen in Zeilenumbrüche umzuwandeln ist besser als zu verwenden tr. Kann jemand es für mich auslegen? Vielen Dank. - Jonathan Hartley


Da diese Frage eine hat Unix tag und alle anderen haben so eine tolle arbeit geleistet Linux Tags können Sie diese Informationen über OS X und andere BSD-abgeleitete Systeme erhalten

ps -p <PID> -wwwe

oder

ps -p <PID> -wwwE

und auf Solaris mit

/usr/ucb/ps -wwwe <PID>

Solaris unterstützt auch die /proc Verzeichnis, wenn Sie sich nicht an das Obskure erinnern möchten ps kommandieren.


52
2017-09-17 20:47



Ich renne ps -p <PID> -wwwwe Unter OS X 10.6 erhalte ich die Liste aller laufenden Prozesse. Der richtige Befehl ist mit -E Flagge, nicht -e. - drAlberT
Ich habe auf OS X 10.4, aber nicht auf 10.5 getestet. Entsprechend aktualisiert. - Gerald Combs
Das ist nicht perfekt. Die Option -E meldet nur die Initiale Umgebungsvariablen. Wenn die Variablen durch den laufenden Prozess selbst geändert wurden (z. B. durch Verwendung der POSIX putenv () - Funktion), werden die Änderungen nicht in der Ausgabe von angezeigt ps -p <PID> -wwE. - Kal
Das Sehen von Umgebungen von Prozessen, die Ihnen nicht gehören, klingt wie eine wünschenswerte Eigenschaft. Dies gilt auch für die Linux-orientierte Antwort von @drAlberT /proc/PID/environ. Diese Dateien sind nur für den Eigentümer des Prozesses lesbar. - Jonathan Hartley
@yani Es ist möglich, aber es ist viel schwieriger, es erfordert einen Debugger an den laufenden Prozess anzuhängen. Siehe diese Antwort: unix.stackexchange.com/a/70636 - Kal


Wie andere bereits erwähnt haben, können Sie unter Linux nach / proc suchen, aber es gibt abhängig von Ihrer Kernel-Version ein oder zwei Limits:

Zuallererst enthält die Umgebungsdatei die Umgebung, wie sie aussah, als der Prozess erzeugt wurde. Das bedeutet, dass alle Änderungen, die der Prozess 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 anfänglich eine sehr begrenzte Umgebung, aber sie wächst, indem sie z. .bashrc aber / proc spiegelt das nicht wider. Die zweite Shell erbt die größere Umgebung von Anfang an, weshalb sie in / proc angezeigt wird.

Bei älteren Kerneln ist der Inhalt der Umgebungsdatei auf eine Seitengröße (4K) 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 ...


24
2017-10-29 11:27



Ist es möglich, die Umgebungsvariablen eines Remote-Prozesses zu erhalten, die nach dem Start des Prozesses gesetzt wurden? Ich verstehe, dass es auf VFS mit / proc / self / environ gezeigt wird, aber nur wenn wir innerhalb des Prozesses sind. Aber wie bekomme ich das für einen Remote-Prozess? - Jeevan Patnaik


korrekte Verwendung von 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. (über)


10
2018-03-04 12:15



Mein Ubuntu zerstört die Umgebungsvariablen direkt gegen die Befehlszeile, ohne auch nur ein Leerzeichen dazwischen zu haben, und schneidet auch eine Zeile im Terminalfenster ab. ich fand ps eww $pid behebt das 2. Problem. - user18911
@ user18911: Die env vars haben ein Nullzeichentrennzeichen. Andere Antworten auf dieser Seite zeigen Möglichkeiten zu verwenden xargs oder tr um diese zur besseren Lesbarkeit in Zeilenumbrüche umzuwandeln. Das hast du wahrscheinlich in den letzten vier Jahren gemerkt. - Jonathan Hartley


cat /proc/PID/environ

Ersetzen Sie PID durch die PID des Prozesses, den Sie sehen möchten. Jede Information über einen laufenden Prozess befindet sich im Verzeichnis / proc / PID /

Beispiel: cat / proc / 32512 / environ


7
2017-09-17 18:19





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

/proc/<pid>/environ

6
2017-09-17 18:19





Genommen von der Archlinux Wiki:

Sie können eine temporäre Funktion erstellen, um die Werte 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
2018-01-13 23:05





Für Solaris 5.10 funktioniert das:

pargs -e <PID>

4
2017-08-08 10:04