Wie kann ich den absoluten Pfad eines laufenden Prozesses kennen?

157614
Jader Dias

Wenn ich mehrere Kopien derselben Anwendung auf der Festplatte habe und nur eine läuft, wie ich sehe ps, wie kann ich dann den absoluten Pfad erkennen, um sie von den anderen zu unterscheiden?

81

8 Antworten auf die Frage

95
akira
% sudo ls -l /proc/PID/exe 

z.B:

% ps -auxwe | grep 24466 Wurzel 24466 0,0 0,0 1476 280? S 2009 0:00 Uhr sshd überwachen % sudo ls -l / proc / 24466 / exe lrwxrwxrwx 1 Wurzel Wurzel 0 Feb 1 18:05 / proc / 24466 / exe -> /package/admin/daemontools-0.76/command/supervise 
In meinem System (ubuntu 14.04) müssen Sie kein Superuser sein, um den Befehl `ls` ausführen zu können. jarno vor 8 Jahren 1
@jarno `ls: kann den symbolischen Link / proc / 28783 / exe nicht lesen: Berechtigung verweigert` - Es geht nicht darum, den Befehl 'ls' auszuführen, sondern um auf die Prozessinformationen eines Prozesses zuzugreifen, der Ihnen nicht gehört. In meiner Box sind ungefähr 97% aller in / proc aufgelisteten Prozesse Root-Prozesse und die anderen auf 11 verschiedene Benutzer verteilt. Irfy vor 8 Jahren 2
13
seenu

Use:

pwdx $pid 

This gives you the current working directory of the pid, not its absolute path.

Usually the which command will tell you which is being invoked from the shell:

#> which vlc /usr/bin/vlc 
Diese Antwort bedarf mehr Zustimmung .. Kokizzu vor 9 Jahren 2
@Kokizzu Nein, nicht, weil die Frage überhaupt nicht beantwortet wird. Der Befehl which sagt nur, 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 vor, Sie hätten ein Dutzend Jdks auf Ihrem Computer. Wenn Sie für einen laufenden Java-Prozess wissen möchten, aus welchem ​​Jdk es entnommen wurde, hilft Ihnen das nicht weiter. Es wird Ihnen nur sagen, von welchem ​​Jdk es genommen wird, wenn Sie es jetzt ausführen. Die akzeptierte Antwort ist auch die richtige. noamik vor 8 Jahren 7
Ein offensichtlicher Weg, auf den diese Antwort falsch ist: Auf meinem Rechner führe ich Prozesse mit verschiedenen JDK-Versionen und einigen 32-Bit / 64-Bit-Schritten aus. Wenn ich die korrekte Version von jstack / jmap für den Prozess ermitteln möchte, funktioniert die obige Antwort nicht, während die akzeptierte Antwort funktioniert. Daniel Da Cunha vor 7 Jahren 0
@Kokizzu Dies beantwortet nur die Frage "Was ist das aktuelle Arbeitsverzeichnis des Prozesses" $ pid "?" Der bearbeitete Beitrag beantwortet die Frage immer noch nicht. "which" sagt nur "Wenn der Befehl auf dem Pfad ist, was ist es dann?" John Strood vor 6 Jahren 0
12
fpmurphy1

Ein Weg ist ps -ef

hat für einen bestimmten Dienst nicht funktioniert, es wird nur der relative Pfad angegeben Jader Dias vor 14 Jahren 4
Hat mir geholfen, einen Prozess über den Befehl zu identifizieren, mit dem er gestartet wurde. jpierson vor 8 Jahren 0
5
Jader Dias
zeigt nicht ALLE vollständigen qualifizierten Pfade auf meinem Linux: "root 24466 0.0 0.0 1476 280? S 2009 0:00 Überwachen von sshd" zum Beispiel akira vor 14 Jahren 1
Dies ist genauer als die anderen Antworten ... vielleicht nicht so nützlich, aber eher die richtige Antwort. Upvoted John Hunt vor 7 Jahren 0
2
mpez0

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

Weitere Informationen finden Sie in den Unix-FAQs, insbesondere in den Fragen 4.3 und 4.4.

2
moodboom

Why does everyone expect you to know the PID? Here's the human-friendly way:

pwdx `pgrep ###process_name###` 
Die Frage lautet "Wie ich mit" ps "sehen kann, daher wird wahrscheinlich die PID angezeigt Scz vor 7 Jahren 0
Ah ok wahr. Ich finde, dass es sich in vielen meiner Anwendungsfälle immer noch um einen schnelleren Liner handelt. moodboom vor 7 Jahren 0
0
jarno

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 Pfad zu bekommen. PID ist der Prozess.

0
ram

lsof ist eine Option. Sie können etwas wie folgt versuchen:

lsof -p PROCESS_ID

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

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

lsof -p 12345 | awk '' | grep 'java $'

Wie ist das anders als die bereits veröffentlichten Antworten genau? Pimp Juice IT vor 7 Jahren 0