Wie kann ich den absoluten Pfad eines laufenden Prozesses erkennen?


93

Wenn ich mehrere Kopien derselben Anwendung auf der Festplatte habe und nur eine ausgeführt wird, wie ich sehen kann ps, wie kann ich den absoluten Pfad kennen, um sie von den anderen zu unterscheiden?

Antworten:


110
% sudo ls -l /proc/PID/exe

z.B:

% ps -auxwe | grep 24466
wurzel 24466 0.0 0.0 1476 280? S 2009 0:00 überwachen sshd
% sudo ls -l / proc / 24466 / exe
lrwxrwxrwx 1 root root 0 1. Februar 18:05 / proc / 24466 / exe -> /package/admin/daemontools-0.76/command/supervise

1
In meinem System (Ubuntu 14.04) müssen Sie kein Superuser sein, um den lsBefehl auszuführen .
Jarno

3
@jarno ls: cannot read symbolic link /proc/28783/exe: Permission denied- Es geht nicht darum, den lsBefehl auszuführen , sondern auf die Prozessinformationen eines Prozesses zuzugreifen, der Ihnen nicht gehört. Auf meiner Box sind ungefähr 97% aller in / proc aufgelisteten Prozesse Root-Prozesse, und die anderen sind auf 11 verschiedene Benutzer verteilt.
Irfy

20

Verwenden:

pwdx $pid

Dies gibt Ihnen das aktuelle Arbeitsverzeichnis der PID, nicht den absoluten Pfad.

Normalerweise whichsagt Ihnen der Befehl, welcher Befehl von der Shell aus aufgerufen wird:

#> which vlc
/usr/bin/vlc

3
Diese Antwort braucht mehr Zustimmung.
Kokizzu

8
@Kokizzu Nein, das tut es nicht, weil es die Frage überhaupt nicht beantwortet. Der Befehl which gibt nur an, welche Binärdatei ausgeführt wird, wenn Sie den Befehl jetzt ausführen. Die Frage war "welche Binärdatei läuft dort schon". Stellen Sie sich zum Beispiel ein Dutzend Jdks auf Ihrem Computer vor. Wenn Sie für einen laufenden Java-Prozess wissen möchten, von welchem ​​JDK es stammt, hilft Ihnen das nicht weiter. Es wird nur angezeigt, von welchem ​​JDK es stammt, wenn Sie es jetzt ausführen. Die akzeptierte Antwort ist auch die richtige.
Noamik

Offensichtlich ist diese Antwort falsch: Auf meinem Computer führe ich Prozesse mit verschiedenen JDK-Versionen und einigen 32-Bit / 64-Bit aus. Wenn ich die richtige jstack- / jmap-Version für den Prozess identifizieren möchte, funktioniert die obige Antwort nicht, während die akzeptierte Antwort funktioniert.
Daniel Da Cunha

@ Kokizzu Dies beantwortet nur die Frage: "Was ist das aktuelle Arbeitsverzeichnis des Prozesses $pid?" Der bearbeitete Beitrag beantwortet die Frage immer noch nicht. whichsagt nur: "Wenn der Befehl auf dem Pfad ist, was ist er dann?"
John Strood

pwdxgib mir den absoluten pfad des ausführbaren programms des prozesses abhängig von pid auf redhat x64 6.3 zurück.
Nick Dong

14

Ein Weg ist ps -ef


5
hat für einen bestimmten Dienst nicht funktioniert, sondern nur den relativen Pfad angegeben
Jader Dias

Hat mir geholfen, einen Prozess über den Befehl zu identifizieren, mit dem er gestartet wurde.
Jpierson


2

Die schnelle Antwort ist die Verwendung psmit Optionen oder den /procDateisysteminformationen. Das funktioniert normalerweise , ist aber nicht garantiert. Im Allgemeinen gibt es keine definitive, garantierte Antwort. Was passiert zum Beispiel, wenn die ausführende Datei während der Ausführung gelöscht wird, sodass kein Pfad zu der Datei vorhanden ist?

In den Unix-FAQ finden Sie weitere Informationen, insbesondere zu den Fragen 4.3 und 4.4.


2

Warum erwarten alle, dass Sie die PID kennen? Hier ist der menschenfreundliche Weg:

pwdx `pgrep ###process_name###`

Die Frage lautet "wie ich sehen kann ps", daher wird wahrscheinlich die PID
angezeigt

Ah ok wahr. Ich finde immer noch, dass dies in vielen meiner Anwendungsfälle ein schnellerer Einzeiler ist.
Moodboom

1

lsof ist eine Option. Sie können Folgendes ausprobieren:

lsof -p PROCESS_ID

Dadurch werden alle vom Prozess geöffneten Dateien aufgelistet, einschließlich des tatsächlichen Speicherorts der ausführbaren Datei. Es ist dann möglich, ein paar weitere awk, cut, grep usw. hinzuzufügen, um die gesuchten Informationen herauszufinden.

Als Beispiel habe ich die folgenden Befehle ausgeführt, um festzustellen, woher mein 'Java'-Prozess stammt:

lsof -p 12345 | awk '{print $ NF}' | grep 'java $'


Wie unterscheidet sich das genau von bereits geposteten Antworten?
Pimp Juice IT

0

Du könntest benutzen

readlink /proc/$(pgrep -x -U $(id -ur) APP_NAME)/exe

oder

find /proc/$(pgrep -x -U $(id -ur) APP_NAME)/exe -printf "%l\n"

um den absoluten Weg zu finden. PID ist der Prozess.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.