如何恢复正在运行的进程已删除的二进制可执行文件

如何恢复正在运行的进程已删除的二进制可执行文件

我有一个运行很长时间的进程。

我不小心删除了该进程的二进制可执行文件。

由于该进程仍在运行并且没有受到影响,因此在其他地方一定有原始的二进制文件......

我怎样才能恢复它? (我使用的是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

相关内容