Linux에서 실행 중인 프로세스의 전체 실행 파일 이름을 얻는 방법

Linux에서 실행 중인 프로세스의 전체 실행 파일 이름을 얻는 방법

실행 중인 프로세스의 파일 이름을 사용할 스크립트를 작성 중입니다. 그러나 확신할 수는 없다.가득한일부 프로세스의 실행 파일 이름입니다.

Name처음에는 의 항목 /proc/PID/status(또는 의 두 번째 필드 )을 쿼리하기로 결정했습니다 /proc/PID/stat. 그러나 따르면맨페이지, 필드는 항상 15자로 잘리지만 충돌/혼란을 피하기 위해 전체 이름이 필요합니다.

에 대한 답변이 문제권장되지만 /proc/PID/cmdline문제가 있습니다. 일부 프로그램(예: 크롬, 전자)은 그 안에 있는 값을 사용하여 어리 석고 영리한 작업을 수행 하므로 거기에서 데이터를 분할 하고 맨페이지에 제안된 프로그램 이름을 직접 얻을 /proc/PID/cmdline수 없습니다. NULL원래 argv [0] 필드를 공백으로 구분하는 것은 경로/파일 이름에 공백이 포함될 수 있으므로 공백으로 구분하는 것은 좋은 옵션이 아니라고 생각합니다.

일부 스크립트(예: Python 스크립트)가 형식이고 일부 스크립트가 형식인 것을 발견하면 /usr/bin/python /path/to/script이는 더욱 복잡해집니다 /path/to/script. 그래도 필드가 있고(위에서 언급한 대로 막힌 부분이 없음) 수동으로 검사하고 분할하는 한 처리하기가 훨씬 쉽습니다.

전체 프로그램 이름/파일 이름을 얻는 방법에 대한 아이디어가 있습니까? 이름에 전체 경로가 포함되어 있는지 여부는 중요하지 않습니다. 이는 처리하기 쉽기 때문입니다(지금까지 본 것에서 볼 수 있음).

답변1

/proc/$PID/exe당신이 찾고있는 것 같습니다 :(proc(5)

/proc/[pid]/exe
Linux 2.2 이상에서 이 파일은 실행된 명령의 실제 경로 이름을 포함하는 심볼릭 링크입니다. 심볼릭 링크는 정상적으로 역참조되며 열려고 하면 실행 파일이 열립니다.

간단히 말해서 다음과 같습니다.

$ /bin/cat & readlink /proc/$!/exe
/bin/cat

실제로 실행 파일의 이름 변경을 따릅니다.

/tmp$ cp /bin/cat . ; ./cat & mv cat dog ; readlink /proc/$!/exe
/tmp/dog

답변2

procfs-2 지원 표준을 사용하는 플랫폼에서는 다음 procfs을 통해 결과를 얻을 수 있습니다.

ls -l /proc/<pid>/path/a.out

a.out 파일은 바이너리 파일의 절대 경로에 대한 심볼릭 링크입니다.

질문에는 Linux가 언급되지 않으므로 procfsprocfs 발명가인 Roger Faulkner의 원래 구현에서 이 기능이 어떻게 작동하는지에 대한 정보를 제공하는 것이 합리적입니다.

관련 정보