MacOS의 PID에서 프로세스 파일 이름을 얻는 방법은 무엇입니까?


13

PID를 사용하여 프로세스의 파일 이름을 얻을 수 있습니까? ps는 프로세스에 대한 유용한 정보를 많이 표시하지만 프로세스 실행 파일 위치에 대한 힌트는 표시하지 않습니다.

답변:


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.


awk를 통한 lsof 출력은 약간의 추가로 훌륭하게 작동합니다. bash 예제와 같이 여러 항목이 있더라도 ; exit첫 번째 txt항목 만 인쇄되도록 print 문 뒤에 추가했습니다 .
qqx

2

예 : 연결 프로세스 명령 이름 뒤에 있습니다 PID 45109...

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

2
경로를 지정하지 않고 이름만으로 바이너리를 시작한 경우 전체 바이너리 경로를 표시하지 않습니다.
grigoryvp '08 년

경로에 공백이 포함 된 경우, 바로 작동하지 않습니다
피터 Lapisu


1

grep이있는 ps -ef가 나를 위해 작동합니다. 특정 파일 이름의 경우 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 명령을 얻는 것을 중지시킵니다)


1

ps -p <pid> -O 명령

L1A1:~ a1155344$ ps -p1 -Ocommand
  PID   TT  STAT      TIME COMMAND
    1   ??  Ss     0:02.26 /sbin/launchd
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.