comment obtenir le nom du fichier de processus à partir de PID dans MacOS?


13

Est-il possible d'obtenir un nom de fichier d'un processus en utilisant PID? ps affiche de nombreuses informations utiles sur un processus, mais pas un indice sur l'emplacement du fichier exécutable du processus.

Réponses:


13

Une façon d'obtenir l'emplacement binaire du processus est d'utiliser lsofet greppour le premier txtsegment. Par exemple, dans le shell pour voir quel est le binaire du shell, utilisez le PID du shell à la place de $$.

$ lsof -p $$ | grep txt
bash    78228 blair  txt    REG   14,2   1244928   6568359 /bin/bash
bash    78228 blair  txt    REG   14,2   1059792  23699809 /usr/lib/dyld
bash    78228 blair  txt    REG   14,2 136368128  81751398 /private/var/db/dyld/dyld_shared_cache_i386

Vous pouvez voir que le shell utilise /bin/bash.

Cette technique fonctionne si le processus a été lancé à l'aide d'un chemin absolu ou relatif. Par exemple, entrer dans un shell et exécuter

$ sleep 1234567

et l'utilisation psdans un autre shell montre seulement comment il a été lancé:

$ ps auxww|grep '[s]leep'
blair    79462   0.0  0.0   600908    744 s011  S+   11:17PM   0:00.00 sleep 1234567

en utilisant lsofmontre quel binaire il a exécuté:

$ lsof -p 79462 | awk '$4 == "txt" { print $9 }'
/opt/local-development/bin/gsleep

J'ai MacPorts coreutils + with_default_names installé, ce qui explique que j'ai ramassé gsleepet non /bin/sleep.


La tuyauterie de sortie lsof via awk fonctionne très bien, avec un ajout mineur. J'ai ajouté ; exitaprès l'instruction print afin que seule la première txtentrée soit imprimée même s'il y en a plusieurs comme dans l'exemple bash.
qqx

2

Exemple: vous recherchez le nom de la commande de processus associé pour PID 45109...

>    % ps awx | awk '$1 == 45109 { print $5 }'
>    /Applications/Safari.app/Contents/MacOS/Safari

2
N'affichera pas le chemin binaire complet si le binaire a été démarré uniquement par son nom sans spécifier de chemin.
grigoryvp

ne fonctionne pas correctement, si le chemin contient des espaces
Peter Lapisu


1

ps -ef avec grep fonctionne pour moi. Pour un nom de fichier spécifique, dirigez simplement grep ainsi:

MacBook:~ Me$ ps -ef | grep Safari | grep -v grep
  501 15733   301   0   0:25.76 ??         1:58.24 /Applications/Safari.app/Contents/MacOS/Safari -psn_0_4977855

(Ce dernier 'grep -v grep' vous empêche simplement d'obtenir votre propre commande grep dans la sortie)


1

ps -p <pid> -Commande

L1A1:~ a1155344$ ps -p1 -Ocommand
  PID   TT  STAT      TIME COMMAND
    1   ??  Ss     0:02.26 /sbin/launchd
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.