Comment puis-je connaître le chemin absolu d'un processus en cours d'exécution?

93

Si j'ai plusieurs copies de la même application sur le disque et qu'une seule est en cours d'exécution, comme je peux le voir ps, comment puis-je connaître le chemin absolu pour la distinguer des autres?

Jader Dias
la source

Réponses:

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

par exemple:

% ps -auxwe | grep 24466
racine 24466 0.0 0.0 1476 280? S 2009 0:00 supervise sshd
% sudo ls -l / proc / 24466 / exe
lrwxrwxrwx 1 racine racine 0 février 1 18h05 / proc / 24466 / exe -> /package/admin/daemontools-0.76/command/supervise
Akira
la source
1
Dans mon système (Ubuntu 14.04), il n'est pas nécessaire d'être superutilisateur pour exécuter la lscommande.
jarno
3
@jarno ls: cannot read symbolic link /proc/28783/exe: Permission denied- il ne s'agit pas d'exécuter la lscommande, mais d'accéder aux informations de processus d'un processus qui ne vous appartient pas. Sur ma machine, environ 97% de tous les processus répertoriés dans / proc sont des processus racine, les autres étant répartis sur 11 utilisateurs différents.
Irfy
20

Utilisation:

pwdx $pid

Cela vous donne le répertoire de travail actuel du pid, pas son chemin absolu.

Habituellement, la whichcommande vous dira lequel est appelé à partir du shell:

#> which vlc
/usr/bin/vlc
seenu
la source
3
cette réponse nécessite plus de votes positifs.
Kokizzu
8
@Kokizzu Non, ce n'est pas parce que cela ne répond pas du tout à la question. La commande qui vous indique uniquement quel binaire sera exécuté si vous l'exécutez maintenant. La question était "quel binaire est déjà en cours d'exécution là-bas". Imaginez par exemple avoir une douzaine de jdks sur votre ordinateur. Si vous voulez savoir pour un processus Java en cours d'exécution dont jdk a été extrait, cela ne vous aidera pas. Il ne vous dira que de quel jdk il sera pris, si vous l'exécutez maintenant. La réponse acceptée est également la bonne.
Noamik
De manière évidente, cette réponse est fausse: sur ma machine, j'exécute des processus avec différentes versions du JDK et certaines versions 32bits / 64bits. Si je veux identifier la version correcte de jstack / jstack pour le processus, la réponse ci-dessus ne fonctionnera pas tant que la réponse acceptée fonctionnera.
Daniel Da Cunha
@Kokizzu Ceci ne fait que répondre à la question "Quel est le répertoire de travail actuel du processus $pid?" Le message édité ne répond toujours pas à la question. whichdit simplement "Si la commande est sur le chemin, alors qu'est-ce que c'est?"
John Strood
pwdxme renvoie le chemin absolu du programme exécutable du processus dépendant de pid sur redhat x64 6.3.
Nick Dong
14

Une façon est ps -ef

fpmurphy
la source
5
ne fonctionnait pas pour un service spécifique, il fournissait simplement le chemin relatif
Jader Dias
M'a aidé à identifier un processus via la commande avec laquelle il a été démarré.
Jpierson
2

La réponse rapide est d'utiliser psavec les options ou les /procinformations du système de fichiers. Cela fonctionnera généralement , mais n'est pas garanti. En général, il n'y a pas de réponse définitive et garantie. Par exemple, que se passe-t-il si le fichier en cours d'exécution est supprimé pendant l'exécution, de sorte qu'il n'y ait pas de chemin d'accès au fichier?

Voir la FAQ Unix pour un peu plus de détails, en particulier les questions 4.3 et 4.4.

mpez0
la source
2

Pourquoi tout le monde s'attend-il à ce que vous connaissiez le PID? Voici le moyen humain-amical:

pwdx `pgrep ###process_name###`
moodboom
la source
La question dit «comme je peux le voir avec ps», elle affichera donc probablement le PID
Scz
Ah ok c'est vrai. Je trouve toujours que cela est un revêtement rapide dans bon nombre de mes cas d'utilisation.
moodboom
1

lsof est une option. Vous pouvez essayer quelque chose comme ci-dessous:

lsof -p PROCESS_ID

Ceci listera tous les fichiers ouverts par le processus, y compris l'emplacement réel de l'exécutable. Il est ensuite possible d’ajouter un peu plus de awk, cut, grep, etc. pour trouver les informations que vous recherchez.

A titre d'exemple, j'ai exécuté les commandes suivantes pour identifier l'origine de mon processus 'java':

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

RAM
la source
En quoi est-ce différent des réponses déjà postées?
Pimp Juice IT
0

Vous pourriez utiliser

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

ou

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

pour obtenir le chemin absolu. Le PID est le processus.

Jarno
la source