실행 중인 프로세스의 파일 이름을 사용할 스크립트를 작성 중입니다. 그러나 나는 그 내용을 단정할 수 없다.가득한일부 프로세스의 실행 파일 이름.
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가 언급되지 않았으므로 procfs
procfs 발명가인 Roger Faulkner가 원래 구현에서 이 기능이 어떻게 작동하는지에 대한 정보를 제공하는 것이 합리적입니다.