削除されたバイナリ実行可能ファイルの実行中のプロセスを回復する方法

削除されたバイナリ実行可能ファイルの実行中のプロセスを回復する方法

長い間実行されるプロセスがあります。

誤ってプロセスのバイナリ実行可能ファイルを削除しました。

プロセスはまだ実行中であり、影響を受けないため、元のバイナリは別の場所にある必要があります。

どのように復元できますか? (私は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

関連情報