как получить имя файла процесса из PID в MacOS?

13

Можно ли получить имя файла процесса, используя PID? ps отображает много полезной информации о процессе, но не подсказку о расположении исполняемого файла процесса.

grigoryvp
источник

Ответы:

13

Одним из способов получения двоичного местоположения процесса является использование lsofи grepдля первого txtсегмента. Например, в оболочке, чтобы увидеть, что такое двоичная оболочка, используйте вместо нее PID оболочки $$.

$ 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

Вы можете видеть, что оболочка использует /bin/bash.

Этот метод работает, если процесс был запущен с использованием абсолютного или относительного пути. Например, зайдя в одну оболочку и запустив

$ sleep 1234567

и использование psв другой оболочке только показывает, как он был запущен:

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

используя lsofпоказывает, какой двоичный файл он выполнял:

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

У меня установлены MacPorts coreutils + with_default_names, что объясняет, что я поднял gsleepи нет /bin/sleep.

Блэр Заяц
источник
Работа с lsof через awk работает отлично, с одним небольшим дополнением. Я добавил ; exitпосле оператора print, чтобы txtбыла напечатана только первая запись, даже если их несколько, как в примере с bash.
QQX
2

Пример: вы после имени команды ассоциированного процесса для PID 45109...

>    % ps awx | awk '$1 == 45109 { print $5 }'
>    /Applications/Safari.app/Contents/MacOS/Safari
Ксеркс
источник
2
Не будет отображать полный двоичный путь, если двоичный файл был запущен только по имени без указания пути.
Григорьев
не работает правильно, если путь содержит пробелы
Питер Лапису
1

у меня работает ps -ef с grep. Для конкретного имени файла просто пройдите через grep следующим образом:

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

(Этот последний 'grep -v grep' просто останавливает получение вашей собственной команды grep в выводе)

HappySpaceInvader
источник
1

ps -p <pid> -команда

L1A1:~ a1155344$ ps -p1 -Ocommand
  PID   TT  STAT      TIME COMMAND
    1   ??  Ss     0:02.26 /sbin/launchd
Джейсон Тан
источник