Czy można znaleźć ścieżkę uruchomionego programu?

17

Mam xmms2duruchomiony proces, ale dwa możliwe pliki wykonywalne (w różnych katalogach, oba na ścieżce wykonywalnej), które mogły go odrodzić. Podejrzewam, że jeden z nich jest uszkodzony, ponieważ czasami ten program działa, a czasem nie. Proces działa teraz, więc chcę usunąć (lub zmienić nazwę) drugiego.

ps ax|grep "xmms"zwraca 8505 ? SLl 2:38 xmms2d -vbez informacji o ścieżce. Biorąc pod uwagę PID, czy mogę sprawdzić, czy został uruchomiony z /usr/bin/xmms2dczy /usr/local/bin/xmms2d?

Dzięki!

Wilk
źródło
2
ps -C xmmspowinien sprawić, że twój grep stanie się przestarzały.
użytkownik nieznany
1
pgrep też by to zrobił.
jlliagre

Odpowiedzi:

22

Spróbuj tego:

ls -l /proc/8505/exe

Lub jeśli nie chcesz analizować danych wyjściowych ls, po prostu wykonaj:

readlink /proc/8505/exe

lub

realpath /proc/8505/exe
Mikel
źródło
6

Jeśli korzystasz z systemu Solaris, sposób działania różni się nieco od sugerowanego dla systemu Linux:

$ 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

Jeśli chcesz poznać bieżący katalog roboczy uruchomionych procesów, możesz użyć:

pwdx $(pgrep xmms)

na przykład:

$ pwdx $(pgrep ksh)
2904: /home/jlliagre
2906: /home/jlliagre
3844: /tmp
jlliagre
źródło
(usunąłem mój komentarz, ponieważ nie był już stosowany po edycji :)
Kjetil Jorgensen,
-1

Uruchamiam podkładkę pod mysz z powłoki:

mousepad & 
[1] 24289

sprawdź, skąd pochodzi:

which mousepad 
   /usr/bin/mousepad

zacznij od ścieżki:

/usr/bin/mousepad &

spójrz przez 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

Jak widzimy, ten wywołany bez ścieżki jest wyświetlany bez ścieżki i zaczyna się od ŚCIEŻKI, a zatem można go znaleźć

which mousepad

To takie proste, prawda? Czekać! Co się stanie, jeśli uruchomię podkładkę pod mysz z menu? Cóż, można to określić przy użyciu ustawień PATH lub bez nich. Próbowałem. Normalny start prowadzi do prostej „podkładki pod mysz” ps v -C. Ponieważ ~ / bin jest pierwszą częścią mojej ŚCIEŻKI, tworzę tam manekina, i voila, manekin jest uruchamiany z menu.

Ale co jeśli uruchomisz program, który sam się usuwa? Który nie znajdzie usuniętego programu i zgłosi niewłaściwy, jeśli na ścieżce jest drugi.

To warunek wyścigu. Jeśli wiesz, że twoje programy nie usuwają się same lub nie są przenoszone podczas sprawdzania ich lokalizacji ps v -C NAMEi which NAMEpowinny działać całkiem dobrze.

nieznany użytkownik
źródło
Czy to zawsze zadziała? Załóżmy, że mam plik wykonywalny w dwóch różnych katalogach i działam ./someexecutablew obu?
apoorv020
Nie, oczywiście, że nie, ponieważ oba będą wyświetlane jako ./someexecutable lub / bin / bash ./someexecutable
użytkownik nieznany
-4

Śmiało i usuń oba pliki (bez opcji force -f). Plik, który zostanie usunięty, to ten, który nie był uruchomiony !!

Systemowe blokowanie plików wykonywalnych nie pozwoli na usunięcie żadnego pliku, który jest aktualnie wykonywany.

Nirbhay
źródło
Twoja odpowiedź nie zawiera prawdziwej odpowiedzi na pytanie.
Risto Salminen,
4
To też jest złe. Możesz usunąć działające pliki wykonywalne bez problemu. Jak myślisz, w jaki sposób pakiety init, które zawsze działają, są aktualizowane? Nie można modyfikować działającego pliku wykonywalnego.
Patrick
1
Jest to alarmująco złe - nie rób tego
Michael Mrozek