오랫동안 실행되는 프로세스가 있습니다.
실수로 프로세스의 바이너리 실행 파일을 삭제했습니다.
프로세스가 여전히 실행 중이고 영향을 받지 않으므로 원본 바이너리가 다른 곳에 있어야 합니다...
어떻게 복원할 수 있나요? (저는 CentOS 7을 사용하고 있으며 실행 프로세스는 C++로 작성되었습니다.)
답변1
이는 메모리에만 있고 복구할 수 없습니다. 이 경우 파일 시스템 복구 도구 중 하나를 사용하여 파일 시스템에서(또는 메모리에서) 복구를 시도해야 합니다. 하지만!
$ cat hamlet.c
#include <unistd.h>
int main(void) { while (1) { sleep(9999); } }
$ gcc -o hamlet hamlet.c
$ md5sum hamlet
30558ea86c0eb864e25f5411f2480129 hamlet
$ ./hamlet &
[1] 2137
$ rm hamlet
$ cat /proc/2137/exe > newhamlet
$ md5sum newhamlet
30558ea86c0eb864e25f5411f2480129 newhamlet
$
통역사의 경우 스크립트 파일을 얻는 것은 아마도 까다로울 수도 있고 불가능할 수도 있습니다. 왜냐하면 스크립트 파일이 무언가를 /proc/$$/exe
가리키고 perl
입력 파일이 이미 닫혀 있을 수 있기 때문입니다.
$ echo sleep 9999 > x
$ perl x &
[1] 16439
$ rm x
$ readlink /proc/16439/exe
/usr/bin/perl
$ ls /proc/16439/fd
0 1 2
표준 파일 설명자만 열려 있으므로 x
사라졌습니다(비록 인터프리터가 메모리에 무엇을 가지고 있는지 아는 사람은 잠시 동안 파일 시스템에 여전히 있을 수 있지만).
답변2
C++이므로 메모리에서 덤프하는 것이 가능하다고 말씀하셨습니다.
먼저 메모리에서 프로세스를 찾아야 합니다.
$ cat /proc/[pid]/maps
00400000-00404000 r-xp 00000000 ca:01 16823 /home/ec2-user/a.out (deleted)
그럼 버릴 수 있어
$ gdb --pid [pid]
dump memory /home/ec2-user/output 0x00400000 0x00404000
chmod +x
그런 다음 실행 파일( ) 로 표시하여 실행할 수 있습니다.
$ file output
output: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, missing section headers