Ist es möglich, den Pfad eines laufenden Programms zu finden?

17

Ich habe einen xmms2dProzess ausgeführt, aber zwei mögliche ausführbare Dateien (in verschiedenen Verzeichnissen, beide im ausführbaren Pfad), die es hervorgebracht haben könnten. Ich vermute, dass einer von denen beschädigt ist, weil manchmal dieses Programm funktioniert und manchmal nicht. Der Prozess, der jetzt ausgeführt wird, funktioniert. Daher möchte ich den anderen löschen (oder umbenennen).

ps ax|grep "xmms"kehrt 8505 ? SLl 2:38 xmms2d -vohne Pfadangabe zurück. Kann ich anhand der PID feststellen, ob sie von /usr/bin/xmms2doder ausgeführt wurde /usr/local/bin/xmms2d?

Vielen Dank!

Wolf
quelle
2
ps -C xmmssollte dein grep obsolet machen.
Benutzer unbekannt
1
pgrep würde es auch tun.
Juli

Antworten:

22

Versuche dies:

ls -l /proc/8505/exe

Oder wenn Sie die Ausgabe von nicht analysieren möchten, tun Sie einfach Folgendes ls:

readlink /proc/8505/exe

oder

realpath /proc/8505/exe
Mikel
quelle
6

Wenn Sie mit Solaris arbeiten, unterscheidet sich die Vorgehensweise geringfügig von der unter Linux vorgeschlagenen:

$ for i in $(pgrep bash)
do
  printf "%6d %s\n" $i $(readlink /proc/$i/path/a.out)
done
   577 /usr/bin/bash
 11247 /usr/bin/bash
 13921 /usr/bin/bash
 13992 /tmp/bash

Wenn Sie das aktuelle Arbeitsverzeichnis der ausgeführten Prozesse kennen möchten, können Sie Folgendes verwenden:

pwdx $(pgrep xmms)

z.B:

$ pwdx $(pgrep ksh)
2904: /home/jlliagre
2906: /home/jlliagre
3844: /tmp
jlliagre
quelle
(Mein Kommentar wurde gelöscht, da er nach der Bearbeitung nicht mehr
Kjetil Jorgensen
-1

Ich starte das Mousepad von der Shell aus:

mousepad & 
[1] 24289

Überprüfen Sie, woher es kommt:

which mousepad 
   /usr/bin/mousepad

Beginne es mit dem Pfad:

/usr/bin/mousepad &

schau per ps:

ps v -C mousepad 
  PID TTY      STAT   TIME  MAJFL   TRS   DRS   RSS %MEM COMMAND
24289 pts/3    S      0:00      3    62 85441 10964  1.0 mousepad
24292 pts/3    S      0:00      0    62 85433 10864  1.0 /usr/bin/mousepad

Wie wir sehen, wird der ohne Pfad aufgerufene Pfad ohne Pfad angezeigt und beginnt mit dem Pfad und ist daher zu finden durch

which mousepad

So einfach ist das, nicht wahr? Warten! Was ist, wenn ich das Mousepad über das Menü starte? Nun, es kann mit oder ohne Verwendung der PATH-Einstellungen angegeben werden. Ich habe es versucht. Ein normaler Start führt zu einem einfachen "Mousepad" in ps v -C. Da ~ / bin der erste Teil meines PATH ist, erstelle ich dort einen Dummy, und voila, der Dummy wird über das Menü gestartet.

Was aber, wenn Sie ein Programm starten, das sich selbst löscht? Die werden das gelöschte Programm nicht finden und ein falsches melden, wenn es eine Sekunde im Pfad gibt.

Das ist also eine Rennbedingung. Wenn Sie wissen , dass Ihre Programme selbst nicht löschen oder nicht bewegen , während Sie ihre Lage ist zu untersuchen, ps v -C NAMEund which NAMEsollen ziemlich gut funktionieren.

Benutzer unbekannt
quelle
Wird das immer funktionieren? Angenommen, ich habe eine ausführbare Datei in zwei verschiedenen Verzeichnissen und ich laufe ./someexecutablein beiden?
apoorv020
Nein, natürlich nicht, da beide als ./someexecutable oder / bin / bash ./someexecutable angezeigt werden
Benutzer unbekannt
-4

Gehen Sie vor und löschen Sie beide Dateien (ohne die Option force -f). Die Datei, die gelöscht wird, ist die, die nicht ausgeführt wurde !!

Durch das Sperren der vom System ausführbaren Dateien können Sie keine derzeit ausgeführten Dateien löschen.

Nirbhay
quelle
Ihre Antwort gibt keine echte Antwort auf die Frage.
Risto Salminen
4
Es ist auch falsch. Sie können laufende ausführbare Dateien ohne Probleme löschen. Wie werden Ihrer Meinung nach Pakete init, die immer ausgeführt werden, aktualisiert? Sie können eine laufende ausführbare Datei nicht ändern .
Patrick
1
Das ist alarmierend falsch - mach das nicht
Michael Mrozek