Ich schreibe ein Skript, das die Dateinamen laufender Prozesse verwendet. Ich kann jedoch nicht feststellen,vollausführbarer Name einiger Prozesse.
Name
Zunä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/cmdline
sodass ich die Daten nicht einfach dort aufteilen NULL
und 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/script
wä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/exe
scheint 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 procfs
mit 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 procfs
ursprünglichen Implementierung des ProCFS-Erfinders Roger Faulkner bereitzustellen.