Gibt es eine Möglichkeit, Umgebungsvariablen anderer Prozesse mit Perl und einer Linux- oder Solaris -Umgebung zu lesen?

StackOverflow https://stackoverflow.com/questions/518803

Frage

In Perl muss ich die Umgebung anderer Prozesse lesen.

  • Das Skript wird mit Root -Privilegien ausgeführt.
  • Das Skript wird sowohl in Linux als auch in Solaris ausgeführt.
  • Ich möchte eine Lösung, die hauptsächlich agnostisch plattform ist, zumindest zwischen Linux und Solaris. Unter Linux untersuchen Sie die /env /u003Cproc_id> /Environ kann mir die Antwort bekommen.
  • Ich möchte es vermeiden, eine Gabelung zu geben. Ich habe bereits eine Lösung, die "/usr/ucb/ps -auxwwwe $ pid" ggab.

Irgendwelche Ideen?

War es hilfreich?

Lösung

Für Solaris könnten Sie das ausprobieren Procfs -Modul von CPAN. Obwohl dieses Modul immer noch ziemlich jung erscheint, klingt dieses Zitat hoffnungsvoll:

Brian Farrell schickte einen sehr nützlichen Patch, der die Inspektion von ARGV und Umgebung von anderen Prozessen als dem derzeit laufenden Prozess übernimmt.

Ich stelle mir vor, dass dies wahrscheinlich nur die ursprüngliche Umgebung ist (genau wie die environ Datei unter Linux), aber das scheint das zu sein, was Sie wollen?

Andernfalls würde eine einfache Lösung wahrscheinlich ~ 20 Zeilen C andrangen, um ein kleines Programm zu erstellen, das die Umgebung auf Solaris als genau das Äquivalent des Linux ausspuckt, obwohl Sie nicht gaben möchten, um ein kleines Programm zu erstellen, das nur die Umgebung auf Solaris ausspuckt environ Datei. Ich habe schon etwas sehr Ähnliches in C. Wenn Sie interessiert sind, kann ich es posten.

Bearbeiten (Nach dem Lesen von OpenSolaris pargs.c): Der Umgebungspuffer wird unter Solaris neu zugewiesen, wenn sich die Umgebung ändert, sodass der PSINFO -Zeiger möglicherweise ungültig ist. Für eine kugelsichere Lösung müssen Sie _Environ jagen. Das ist alles wahrscheinlich mehr Ärger als du brauchst ... pargs -e <pid> Könnte eine schönere Veränderung für UCB sein ps(1) Wenn Sie jedoch die Gabelstrecke besuchen.

Andere Tipps

In Linux sieht es aus wie das /proc/<pid>/environ PSUEDOFILES enthalten die Umgebungsvariable, die beim Erstellen des Prozesses übergeben wurden. Wenn Sie eine ausreichende Erlaubnis haben, können Sie diese lesen.

Sie scheinen nach dem Start keine Änderungen in der Umgebung mit der Prozesse zu verfolgen.

Dies deutet darauf hin, dass Sie den Prozess des Prozesses Speicher abbauen müssten, um das zu erhalten, was Sie verlangen.

Schwierig.

Das GNU 'Binutils' -Paket enthält ein CLI -Dienstprogramm namens namens strings. Sehen http://www.gnu.org/software/binutils/ Für mehr Information.

strings /proc/pid/environ - druckt eine schöne Liste der Umgebungsvariablen ähnlich wie env.

Das erste, was mir in den Sinn kommt, ist, GDB an den fraglichen Prozess zu verbinden und dann GDB zu bitten, die Umgebung für Sie zu erhalten. Sie können dies mit dem Befehl "Showumgebung" in der GDB -Shell tun.

Es sieht so aus, als ob es ein Perl -Modul gibt, das dies für Sie tun kann.Entwicklung :: Gdb. Ich habe es noch nicht ausprobiert, aber es sieht nach einer einfachen Frage der Programmierung aus, um das Devel :: GDB -Objekt zu erstellen, eine Verbindung zu dem Prozess herzustellen, den Sie inspizieren, den Befehl "Umgebung anzeigen" senden und dann die Ergebnisse analysieren.

Ich muss allerdings sagen ... wenn die Lösung so kompliziert ist, machen Sie wahrscheinlich etwas anderes falsch. Warum brauchen Sie die Umgebung für einen zufälligen Prozess überhaupt?

Wenn PS es kann, wie Sie sagen, ist Ihre Antwort irgendwo im Quellcode von PS zu finden. Das würde das Laichen eines neuen Prozesses vermeiden.

Unter Linux kann es ausreichen, die zu beheben /proc/[pid]/cwd Symlink, siehe Procfs (5).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top