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