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.

grigoryvp
la source

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.

Blair Zajac
la source
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
Xerxès
la source
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)

HappySpaceInvader
la source
1

ps -p <pid> -Commande

L1A1:~ a1155344$ ps -p1 -Ocommand
  PID   TT  STAT      TIME COMMAND
    1   ??  Ss     0:02.26 /sbin/launchd
Jason Tan
la source