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 constater avec ps
, comment puis-je connaître le chemin absolute pour le distinguer des autres?
% 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 18:05/proc/24466/exe ->/package/admin /daemontools-0.76/command/supervise
Utilisation:
pwdx $pid
Cela vous donne le répertoire de travail actuel du pid, pas son chemin absolu.
Habituellement, la commande which
vous dira lequel est appelé à partir du shell:
#> which vlc
/usr/bin/vlc
Une façon est ps -ef
Pourquoi tout le monde s'attend-il à ce que vous connaissiez le PID? Voici le moyen humain-amical:
pwdx `pgrep ###process_name###`
La réponse rapide consiste à utiliser ps
avec des options ou les informations du système de fichiers /proc
. Cela fonctionnera généralement, mais ce 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 a pas de chemin d'accès au fichier?
Voir Unix FAQ pour un peu plus de détails, en particulier les questions 4.3 et 4.4.
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 $'
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.