Gibt es eine Möglichkeit zum Lesen von environment-Variablen der anderen Prozesse mit Hilfe von Perl und in einem Linux-oder Solaris-Umgebung?
In Perl, die ich Lesen müssen, der Umwelt in anderen Prozessen.
- Das script läuft mit root
Privilegien. - Wird das script
läuft in Linux-und Solaris. - Ich möchte eine Lösung, die meist Plattform-Agnostiker, zumindest zwischen Linux und Solaris. In Linux, die Prüfung der /env/<proc_id>/environ kann mir die Antwort.
- Ich möchte vermeiden, dass Gabel. Ich habe bereits eine Lösung Gabelung "/usr/ucb/ps -auxwwwe $pid"
Irgendwelche Ideen?
InformationsquelleAutor jac_no_k | 2009-02-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für Solaris, könnten Sie versuchen, die procfs-Modul aus dem CPAN. Obwohl dieses Modul scheint noch Recht jung ist, dieses Zitat klingt hoffnungsvoll:
Ich kann mir vorstellen, dass dies wahrscheinlich nur die erste Umgebung (ebenso wie die
environ
- Datei unter linux), aber das scheint das zu sein, was Sie wollen?Sonst, obwohl ich sehe, Sie sagen, Sie wollen nicht bis zum Verbraucher, eine einfache Lösung wäre wohl, Kurbel ~20 Zeilen C zu produzieren, ein kleines Programm, das nur spuckt die Umgebung auf Solaris als das genaue äquivalent der Linux
environ
- Datei. Ich habe etwas sehr ähnliches in C schon. Wenn du interessiert bist, kann ich es posten.EDIT (nach Lesen von OpenSolaris pargs.c): Die Umwelt-Puffer reserviert, die unter Solaris auf, wenn die Umgebung sich ändert, so dass die psinfo Zeiger kann ungültig sein. Für ein bullet-proof-Lösung, die Sie benötigen, zu jagen _environ. Das ist alles, wahrscheinlich mehr ärger als Sie benötigen...
pargs -e <pid>
vielleicht eine schönere Alternative zu UCBps(1)
wenn man die Gabel route, obwohl.InformationsquelleAutor Martin Carpenter
In linux sieht es aus wie die
/proc/<pid>/environ
psuedofiles enthalten die environ-variable übergeben, wenn der Prozess erstellt wurde. Wenn Sie über ausreichend Berechtigungen verfügen, können Sie Lesen Sie die.Erscheinen Sie nicht zur Verfolgung von änderungen in den Prozessen, die Umgebung nach dem Start.
Deuten darauf hin, dass Sie würde haben zu disect die Prozesse Speicher-dump zu bekommen, was Sie für Fragen.
Schwierig.
Die Solaris /proc-Dateisystem (Solaris 10) nicht angezeigt, auch die original-Umgebung.
werfen Sie einen Blick auf /proc/pid/psinfo-Datei, und siehe struct psinfo aus <procfs.h>. Feld pr_envp ist die erste Umgebung.
InformationsquelleAutor dmckee
Den GNU-binutils Paket enthält eine CLI-Dienstprogramm namens
strings
. Sehen http://www.gnu.org/software/binutils/ für mehr info.strings /proc/pid/environ
- druckt eine schöne Liste von Umgebungsvariablen wie vielenv
./proc/$$/environ
ist ein null-getrennte Liste vonKEY=value
Saiten (ich fand heraus Fragenxxd /proc/$$/environ
aber es ist wohl irgendwo dokumentiert). Sie können schalten Sie ihn in etwas besser lesbar mit nur standard-POSIX-tools. Verwenden Sie einfachcat /proc/$$/environ | tr '\0' '\n'
.Danke. Das funktioniert. Beide xxd und die Verwendung von tr zu reparieren, die Ausgabe sind sehr hilfreich.
InformationsquelleAutor sixerjman
Das erste, was mir in den Sinn kommt, ist die Verwendung des GDB zu befestigen, um die
Prozess in Frage, und dann Fragen Sie den GDB, um die Umgebung für die
Sie. Sie können dies tun, mit der "show-Umgebung" - Befehl in der GDB
shell.
Sieht es aus wie es ist ein Perl-Modul, kann dies für Sie tun,
Devel::GDB. Ich habe nicht
versucht es noch, aber es sieht aus wie eine Einfache Sache zu Programmieren, um
erstellen Sie die Devel::GDB-Objekt, eine Verbindung zu dem Prozess, den Sie möchten
prüfen, senden die "Umwelt" - Befehl, und dann analysieren die
Ergebnisse.
Ich muss aber sagen... wenn die Lösung ist so kompliziert, Sie
sind wohl etwas anderes falsch. Warum brauchen Sie die
Umgebung für einen zufälligen Prozess, eh?
Karte Umgebung zeigt die Umgebung der gdb, nicht der Prozess, mit dem es verbunden ist. Aus dem gdb-Handbuch: "Drucken Sie den Wert der Umgebungsvariable varname gegeben werden, um Ihr Programm, wenn es gestartet wird." In anderen Worten, show-Umfeld ist hilfreich, wenn Sie planen, ein Programm starten, aber es ist nicht sinnvoll, für, erzählen Sie über die Umgebung des Programms, das Sie anfügen. Korrigieren Sie mich, wenn ich falsch bin, aber meine tests und Lesen der Anleitung vermuten, dass diese Antwort völlig falsch.
InformationsquelleAutor jrockway
Wenn ps kann es tun, wie du sagst, dann deine Antwort gefunden werden kann irgendwo in den Quellcode von ps. Das würde vermeiden, das hervorbringen eines neuen Prozesses.
InformationsquelleAutor Thomas
Unter Linux kann es ausreicht, um die
/proc/[pid]/cwd
symlink, siehe procfs(5).InformationsquelleAutor Jakub Klinkovský