So erhalten Sie den vollständigen ausführbaren Namen eines laufenden Prozesses in Linux

So erhalten Sie den vollständigen ausführbaren Namen eines laufenden Prozesses in Linux

Ich schreibe ein Skript, das die Dateinamen laufender Prozesse verwendet. Ich kann jedoch nicht feststellen,vollausführbarer Name einiger Prozesse.

NameZunächst habe ich beschlossen, den Eintrag in /proc/PID/status(oder das zweite Feld in ) abzufragen /proc/PID/stat. Laut demmanpage, dieses Feld wird immer auf 15 Zeichen gekürzt, aber ich brauche den vollständigen Namen, um Konflikte/Verwirrungen zu vermeiden.

Eine Antwort vondiese Frageschlägt vor, zu verwenden /proc/PID/cmdline, aber auch hier gibt es Probleme. Einige Programme (z. B. Chromium, Electron) machen dumme/schlaue Dinge mit dem Wert in, /proc/PID/cmdlinesodass ich die Daten nicht einfach dort aufteilen NULLund direkt den Programmnamen erhalten kann, wie in der Manpage vorgeschlagen - sie füllen das ursprüngliche Feld argv[0] mit vielen Dingen aus und trennen sie durch Leerzeichen, und ich denke nicht, dass das bloße Aufteilen durch Leerzeichen eine gute Wahl ist, da der Pfad/Dateiname Leerzeichen enthalten kann.

Dies ist noch komplizierter, wenn ich feststelle, dass einige Skripte (z. B. Python-Skripte) im Formular sind, /usr/bin/python /path/to/scriptwährend andere im Formular sind /path/to/script. Dies ist jedoch viel einfacher zu handhaben, solange ich dieses Feld habe (ohne Staus wie oben) und manuell prüfen und aufteilen kann.

Irgendwelche Ideen, wie man den vollständigen Programmnamen/Dateinamen bekommt? Es spielt keine Rolle, ob der Name den vollständigen Pfad enthält oder nicht, denn das lässt sich (soweit ich das jetzt sehe) leicht handhaben.

Antwort1

/proc/$PID/exescheint das zu sein, wonach Sie suchen: (proc(5)

/proc/[pid]/exe
Unter Linux 2.2 und höher ist diese Datei ein symbolischer Link, der den tatsächlichen Pfadnamen des ausgeführten Befehls enthält. Dieser symbolische Link kann normal dereferenziert werden. Beim Versuch, ihn zu öffnen, wird die ausführbare Datei geöffnet.

Also einfach:

$ /bin/cat & readlink /proc/$!/exe
/bin/cat

Es folgt tatsächlich eine Umbenennung der ausführbaren Datei:

/tmp$ cp /bin/cat . ; ./cat & mv cat dog ; readlink /proc/$!/exe
/tmp/dog

Antwort2

Auf einer Plattform mit einem Standard procfsmit Procfs-2-Unterstützung erhalten Sie das Ergebnis über:

ls -l /proc/<pid>/path/a.out

Die Datei a.out ist ein symbolischer Link zum absoluten Pfad der Binärdatei.

Beachten Sie, dass Linux in der Frage nicht erwähnt wurde. Aus diesem Grund ist es sinnvoll, Informationen zur Funktionsweise dieser Funktion bei der procfsursprünglichen Implementierung des ProCFS-Erfinders Roger Faulkner bereitzustellen.

verwandte Informationen