Est-il possible de trouver le chemin d'un programme en cours d'exécution?


17

J'ai un xmms2dprocessus en cours d'exécution, mais deux fichiers exécutables possibles (dans des répertoires différents, tous deux dans le chemin exécutable) qui auraient pu le générer. Je soupçonne que l'un d'eux est corrompu, car parfois ce programme fonctionne et parfois non. Le processus en cours d'exécution fonctionne maintenant, donc je veux supprimer (ou renommer) l'autre.

ps ax|grep "xmms"renvoie 8505 ? SLl 2:38 xmms2d -vsans informations de chemin. Étant donné le PID, pourrais-je savoir s'il a été exécuté depuis /usr/bin/xmms2dou /usr/local/bin/xmms2d?

Merci!


2
ps -C xmmsdevrait rendre votre grep obsolète.
utilisateur inconnu

1
pgrep le ferait aussi.
jlliagre

Réponses:


22

Essaye ça:

ls -l /proc/8505/exe

Ou si vous ne voulez pas analyser la sortie de ls, faites simplement:

readlink /proc/8505/exe

ou

realpath /proc/8505/exe

6

Si vous exécutez Solaris, la manière est légèrement différente de celle suggérée par 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

Si vous souhaitez connaître le répertoire de travail actuel des processus en cours d'exécution, vous pouvez utiliser:

pwdx $(pgrep xmms)

par exemple:

$ pwdx $(pgrep ksh)
2904: /home/jlliagre
2906: /home/jlliagre
3844: /tmp

(supprimé mon commentaire car il ne s'appliquait plus après votre modification :)
Kjetil Jorgensen

-1

Je lance le tapis de souris à partir du shell:

mousepad & 
[1] 24289

vérifier d'où il vient:

which mousepad 
   /usr/bin/mousepad

démarrez-le avec chemin:

/usr/bin/mousepad &

regardez via 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

Comme nous le voyons, celui invoqué sans chemin est affiché sans chemin, et a commencé avec le PATH, et donc être trouvé par

which mousepad

C'est aussi simple que ça, non? Attendez! Et si je lance le tapis de souris dans le menu? Eh bien, cela peut être spécifié avec ou sans utiliser les paramètres PATH. J'ai essayé. Un démarrage normal mène à un simple «tapis de souris»ps v -C . Puisque ~ / bin est la première partie de mon CHEMIN, je crée un mannequin là-bas et, le tour est joué, le mannequin est démarré à partir du menu.

Mais que faire si vous démarrez un programme qui se supprime? Qui ne trouvera pas le programme supprimé et n'en signalera pas un mauvais, s'il y en a un second sur le chemin.

C'est donc une condition de course. Si vous savez que vos programmes ne se suppriment pas d'eux-mêmes ou ne sont pas déplacés pendant que vous étudiez leur emplacement, ps v -C NAMEet which NAMEdevraient fonctionner plutôt bien.


Est-ce que cela fonctionnera toujours? Supposons que j'ai un exécutable dans deux répertoires différents et que j'exécute ./someexecutabledans les deux?
apoorv020

Non, bien sûr que non, car les deux s'afficheront sous la forme ./someexecutable ou / bin / bash ./someexecutable
utilisateur inconnu

-4

Allez-y et supprimez les deux fichiers (sans forcer l'option -f). Le fichier qui est supprimé est celui qui ne tournait pas !!

Le verrouillage des fichiers exécutables du système ne vous permettra pas de supprimer les fichiers en cours d'exécution.


Votre réponse ne fournit pas une vraie réponse à la question.
Risto Salminen

4
C'est également faux. Vous pouvez supprimer les exécutables en cours d'exécution sans problème. Comment pensez-vous que les packages tels que init, qui sont toujours en cours d'exécution, sont mis à niveau? Vous ne pouvez pas modifier un exécutable en cours d'exécution.
Patrick

1
Ceci est alarmant - ne faites pas cela
Michael Mrozek
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.