it-swarm.com.de

Kann ich Standardwerkzeuge verwenden, um den vollständigen Namen eines Prozesses abzurufen, wenn sein Name Leerzeichen enthält?

Ich verstehe, dass es eine seltene Situation für eine ausführbare Datei sein kann, Leerzeichen darin zu haben, aber es könnte passieren.

Ein Beispiel könnte die beste Erklärung sein.

Mit Standardwerkzeugen möchte ich den Speicherort (im Dateisystem) der ausführbaren Datei bestimmen, die das aktuelle Fenster besitzt (?) ...

  1. aktuelle Fenster-ID abrufen ... (xdotool getactivewindow)
  2. benutze die ID um die PID zu erhalten ... (wmctrl -p -l | sed ... ID ....
  3. verwenden Sie die PID, um den Namen der ausführbaren Datei abzurufen ... (ps -A ... hier Hier treten Probleme auf!

Wenn ps nur den Namen der ausführbaren Datei auflistet (-o ucmd), wird der Name auf 15 Zeichen gekürzt, sodass diese Option für alle längeren Namen ausgeschlossen ist.
Das Verbreitern der Spalte (-o ucmd:99) spielt keine Rolle. Wenn pgrep eine Rolle spielt, ist die Übereinstimmung aufgrund von stat auf 15 begrenzt (siehe: info pgrep ) ..

Auflistungen in Varianten des "Voll" -Modus (zB -A w w) sind nicht sinnvoll, wenn der betreffende Name Leerzeichen enthält, da dieser Name durch ein anderes Leerzeichen von seinen Argumenten getrennt ist ! .. Wenn der Prozess im "vollständigen" Modus über einen Link gestartet wurde, wird anstelle des Namens der ausführbaren Datei der Name des Links angezeigt.

Gibt es eine Möglichkeit, dies zu tun (mit Standardwerkzeugen)? ... oder sind Räume hier ein Aushängeschild?

6
Peter.O

Alle Dienstprogramme beziehen ihre Informationen ohnehin von _/proc/$PID_, aber es gibt (mindestens) drei Stellen in _/proc/$PID_, die den Namen der ausführbaren Datei in irgendeiner Form enthalten, und sie melden unterschiedliche Informationen.

  • Das Feld Name in _/proc/$PID/status_ (auch in einer schwerer zu analysierenden Form in _/proc/$PID/stat_ verfügbar). Dies ist der Name der ausführbaren Datei, jedoch auf 15 Zeichen gekürzt. Da der Kernel die Kürzung durchführt, kann keine Option für ps helfen. Das zeigt _ps -o comm_ (oder sein Synonym _ps -o ucmd_).
  • Die symbolische Verknüpfung _/proc/$PID/exename_ verweist auf die ausführbare Datei. Sie können den Inhalt mit readlink /proc/$PID/exename abrufen. Im Gegensatz zu den von ps gemeldeten Informationen hat nur der Benutzer, der den Prozess ausführt, die Berechtigung, das Linkziel zu lesen.
  • Das nullte Argument für den Prozess, das von der Shell oder einem anderen Programm, das ihn aufgerufen hat, ausgewählt wurde. Per Konvention wählen Shells den Namen der ausführbaren Datei während der Eingabe (mit oder ohne vollständigen Pfad). Sie können alle Argumente von ps mit _ps -o cmd_ (oder seinem Synonym _ps -o command_) abrufen, aber die Argumente sind durch Leerzeichen getrennt, sodass Sie nicht zuverlässig erkennen können, wo das nullte Argument endet. Sie können die Argumente aus _/proc/cmdline_ lesen, wobei sie durch ein Nullzeichen getrennt sind: </proc/$PID/cmdline awk -vRS='\0' '{print; exit;}' extrahiert das nullte Argument.

Lassen Sie mich der Vollständigkeit halber erwähnen, dass sich diese Namen im Laufe des Prozesses ändern können, obwohl die meisten Programme dies nicht tun:

  • Der Prozess kann das Feld Name von _/proc/$PID/status_ ändern, indem prctl mit dem Argument _PR_SET_NAME_ aufgerufen wird.
  • Die ausführbare Datei kann umbenannt oder gelöscht werden. In einfachen Fällen verfolgt Linux den neuen Namen (Edge-Fälle funktionieren jedoch möglicherweise nicht, wenn Sie beispielsweise eine feste Verbindung zur ausführbaren Datei herstellen). Wenn die Datei gelöscht wird, fügt der Kernel dem Linkziel _(deleted)_ hinzu.
  • Das nullte Argument für den Prozess wird aus dem Prozessspeicher gelesen (es ist _argv[0]_ in C). Der Prozess kann es frei ändern.
7
Gilles
ps $PID | tail -1 | awk '{i=5; while (i<NF) {printf "%s ", $i; i++}; print $NF}'

Wobei $ PID die PID ist, die Sie haben. Wahrscheinlich ist der vollständige Befehl, den Sie möchten (basierend auf Ihrer obigen Frage):

which "$(ps $(xdotool getwindowpid $(xdotool getactivewindow)) | tail -1 | awk '{i=5; while (i<NF) {printf "%s ", $i; i++}; print $NF}')"
0
zpletan