프로세스를 시작한 다음 해당 바이너리를 삭제해도 다음에서 복원할 수 있습니다 /proc/<pid>/exe
.
$ cp `which sleep` .
$ ./sleep 10m &
[1] 13728
$ rm sleep
$ readlink /proc/13728/exe
/tmp/sleep (deleted)
$ cp /proc/13728/exe ./sleep-copy
$ diff sleep-copy `which sleep` && echo not different
not different
$ stat /proc/13728/exe
File: ‘/proc/13728/exe’ -> ‘/tmp/sleep (deleted)’
Size: 0 Blocks: 0 IO Block: 1024 symbolic link
반면에 내가 직접 심볼릭 링크를 만드는 경우 대상을 삭제하고 복사해 보세요.
cp: cannot stat ‘sleep’: No such file or directory
/proc
커널의 인터페이스입니다. 그렇다면 이 심볼릭 링크는 실제로 메모리에 로드된 복사본을 가리키지만 더 유용한 이름을 갖고 있습니까? 이 링크는 정확히 어떻게 exe
작동하나요?
답변1
/proc/<pid>/exe
기호 링크의 일반적인 의미를 따르지 않습니다. 기술적으로 이는 POSIX 위반으로 간주될 수 있지만 /proc
결국 이는 특수 파일 시스템입니다.
/proc/<pid>/exe
사용하면 심볼릭 링크처럼 보입니다 stat
. 이는 커널이 알고 있는 프로세스 실행 파일의 경로 이름을 내보내는 편리한 방법입니다. 그러나 실제로 해당 "파일"을 열면 심볼릭 링크 아래의 내용을 읽는 일반적인 프로세스가 없습니다. 대신 커널은 열려 있는 파일 항목에 대한 직접 액세스만 제공합니다.
ls -l
실행 파일이 삭제된 프로세스에 대한 더미 파일을 생성할 때 /proc/<pid>/exe
심볼릭 링크 대상의 끝에는 "(삭제됨)"이라는 문자열이 있습니다. 이는 일반적으로 심볼릭 링크에서는 의미가 없습니다. 이름이 "(삭제됨)"으로 끝나는 파일은 확실히 대상 경로에 존재하지 않습니다.
너무 길어요.파일 시스템 proc
구현은 경로 이름 확인을 통해 자체적인 마법을 수행합니다.
답변2
/proc에 대한 매뉴얼 페이지에 따르면 Linux 2.2 이상에서 이 파일은 실행된 명령의 실제 경로 이름을 포함하는 심볼릭 링크입니다. 분명히 바이너리는 메모리에 로드되고 /proc/[pid]/exe
바이너리의 내용을 가리킵니다.기억 속에.
반면, Linux 2.0 및 이전 버전에서는 /proc/[pid]/exe
분명히 다음과 같은 점이 있습니다.문서(파일 시스템에서)이 실행됩니다.
따라서 Linux 2.0 이하 버전에서 동일한 명령 목록을 실행하면 "해당 파일이나 디렉터리가 없습니다"라는 오류가 나타날 수 있습니다.
답변3
모든 파일은 /proc
요청 시 생성됩니다. 따라서 때때로 일반 파일과 약간 다르게 동작합니다.
예를 들어, 많은 파일이 /proc
디렉토리 목록에 크기 0의 일반 파일로 나타납니다. 그러나 읽어 보면 비어 있지 않습니다. 그 이유는 파일의 내용이 요청 시 생성되기 때문입니다. 내용은 시간이 지남에 따라 변경되거나 파일을 연 프로세스에 따라 달라질 수도 있습니다. 따라서 파일을 열어서 읽어보지 않고는 내용의 크기를 알 수 있는 방법이 없습니다.
/proc/<pid>/exe
커널 내에서 열린 파일 설명에 대한 참조입니다. 열린 파일에 대한 설명을 정확하게 전달할 수 있는 방법은 없습니다. 이는 커널 내부의 데이터 구조입니다. 따라서 커널은 이를 대략적인 방식, 즉 파일에 대한 심볼릭 링크로 표현합니다. 추상 파일 시스템 계층에서 유지 관리하는 정보 덕분에 커널은 파일 이름을 기억하고 파일 이름이 변경된 경우에도 파일을 추적합니다. 파일이 삭제되면 커널은 알고 있는 성을 기억하고 이를 (deleted)
이름에 추가합니다. 심볼릭 링크 대상으로 반환된 문자열은 readlink
프로세스가 호출할 때마다 동적으로 생성됩니다. 뒤에서 열린 /proc/<pid>/exe
바로가기는 일반적인 기호 링크 확인을 수행하고 파일 설명을 직접 엽니다. /proc/<pid>/fd/<number>
, /proc/<pid>/cwd
및 /proc/<pid>/root
기타 유사한 링크 에도 동일하게 적용됩니다 .
"마법의" 심볼릭 링크의 또 다른 예는 입니다 /proc/self
. 이는 동적으로 생성되며 /proc/<pid>
이에 액세스하는 프로세스의 디렉터리를 가리킵니다.