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

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

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

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

의 답변이 질문를 사용하라고 제안했지만 /proc/PID/cmdline문제도 있습니다. 일부 프로그램(예: 크롬, 전자)은 값에 대해 어리 석고 똑똑한 작업을 수행 /proc/PID/cmdline하므로 맨 페이지에 제안된 대로 데이터를 분할하고 직접 프로그램 이름을 얻을 수 없습니다 NULL. 원본에 많은 항목을 채웁니다. argv[0] 필드를 지정하고 공백으로 구분합니다. 경로/파일 이름에 공백이 포함될 수 있으므로 단순히 공백으로 분할하는 것은 좋은 선택이 아니라고 생각합니다.

/usr/bin/python /path/to/script일부 스크립트(예: Python 스크립트) 가 형식인 반면 일부 스크립트는 형식인 것을 발견하면 이는 훨씬 더 복잡해집니다 /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가 원래 구현에서 이 기능이 어떻게 작동하는지에 대한 정보를 제공하는 것이 합리적입니다.

관련 정보