使用终端恢复你 Linux 系统上仍在执行程序的已删除档案的快速指南。
许多情况下,删除的档案都可以恢复,比如在该档案有活动的程序在操作它,并且目前被单个或多个使用者使用时。在 Linux 系统中,每个当前正在执行的程序都会获得 ID,其被称之为程序识别符号 “PID”,并将它们存放在 /proc 目录中。这正是我们恢复仍在执行的程序中(具有 PID)已删除的档案所需要的东西。这里就是介绍我们如何做到这一点的。
假设你开启了一个压缩档案,之后你删除了这个档案。为了演示目的,压缩档案称为 “opengapps.zip”,这将是之后我们将开启和删除的档案。
计算原始档案的 MD5 杂凑
删除之前,我们将计算该档案的 MD5 。这样我们可以将原来的 MD5 杂凑值与恢复档案的 MD5 杂凑进行比较。这个过程将保证我们恢复的压缩档案的完整性是一样的,它没有被破坏。

md5sum opengapps.zip >> md5-opengapps.txt

要显示文字档案的内容。

cat md5-opengapps.txt

86489b68b40d144f0e00a0ea8407f7c0 opengapps.zip

检查压缩档案的 MD5 杂凑值之后。我们将压缩档案保持开启(LCTT 译注:此处是使用 file-roller 这个图形介面的解压程式保持对该压缩档案的开启,其内建在 GNOME 环境中;在桌面环境中,使用桌面工具开启一个压缩包也能起到同样的作用。又及,本文举例不是很恰当,如果是删除了某个服务程序的已经开启的配置档案,那么这种恢复就很有意义),并将其删除。之后,我们将从档案的恢复过程开始,步骤如下:

rm opengapps.zip

删除档案的恢复过程
正如我们前面提到的,执行的程序在 /proc 目录中。我们可以使用以下命令搜寻该目录中需要的程序:
由于我们已经知道档名包括 .zip 副档名,因此我们可以使用 .zip 副档名进行搜寻。它将限制输出结果并显示所需的程序。

ps -axu | grep .zip

m 13119 0.8 1.0 121788 30788 ? Sl 06:17 0:00 file-roller /home/m/Downloads/Compressed/opengapps.zip
m 13164 0.0 0.0 5108 832 pts/20 S+ 06:18 0:00 grep –color=auto .zip

然后我们将进入到包含 PID 13119 的目录并开启 fd 子目录。

cd /proc/13119/fd

fd(档案描述符)目录包含多个档案,包括我们需要恢复的档案。该档案以硬连结的方式连结到原始档案。 fd 目录中的所有档案都以数字连结到 “档名” 。因此,要确定这些档案中的哪一个连结到该原始档案,我们将用详细列表选项列出 /fd 目录。

ls -l

total 0
lr-x—— 1 m m 64 Jul 14 06:17 0 -> /dev/null
lrwx—— 1 m m 64 Jul 14 06:17 1 -> socket:[26161]
lrwx—— 1 m m 64 Jul 14 06:17 10 -> anon_inode:[eventfd]
lr-x—— 1 m m 64 Jul 14 06:17 11 -> anon_inode:inotify
lrwx—— 1 m m 64 Jul 14 06:17 12 -> socket:[5752671]
lr-x—— 1 m m 64 Jul 14 06:17 13 -> /home/m/Downloads/Compressed/opengapps.zip (deleted)
lrwx—— 1 m m 64 Jul 14 06:17 2 -> socket:[26161]
lrwx—— 1 m m 64 Jul 14 06:17 3 -> anon_inode:[eventfd]
lrwx—— 1 m m 64 Jul 14 06:17 4 -> anon_inode:[eventfd]
lrwx—— 1 m m 64 Jul 14 06:17 5 -> socket:[5751361]
lrwx—— 1 m m 64 Jul 14 06:17 6 -> anon_inode:[eventfd]
lrwx—— 1 m m 64 Jul 14 06:17 7 -> anon_inode:[eventfd]
lrwx—— 1 m m 64 Jul 14 06:17 8 -> socket:[5751363]
lrwx—— 1 m m 64 Jul 14 06:17 9 -> socket:[5751365]

正如你在终端输出中看到的,原始档案 “opengapps.zip” 已被删除,但它仍然连结到一个档名 13,其程序 PID 13119 。但是,我们仍然可以通过将连结的档案复制到安全的地方来恢复它。

cp 13 /home/m/Downloads/Compressed

档案复制后。我们将返回包含恢复档案的目录,并使用以下命令重新命名它。

mv 13 opengapps-recovered.zip

计算恢复档案的 MD5 杂凑
由于我们已经恢复了该档案。让我们检查该档案的完整性,这只是为了确保档案没有损坏,并且和原来一样。早先我们储存了原始档案的 MD5 杂凑值。

md5sum opengapps-recovered.zip >> md5-opengapps.txt

该命令将检查档案的 MD5 杂凑值,并在档案中追加新恢复档案的 MD5 杂凑值,以轻松比较两个 MD5 杂凑值。
可以显示文字档案的内容来比较原始档案和恢复档案的 MD5 杂凑值。

cat md5-opengapps.txt

86489b68b40d144f0e00a0ea8407f7c0 opengapps.zip
86489b68b40d144f0e00a0ea8407f7c0 opengapps-recovered.zip

恢复档案的 MD5 杂凑是一样的。所以,我们成功地恢复了我们以前删除的档案,并且恢复后档案完整性一致,并且工作正常。

注意: 在某些情况下,某些档案无法通过 ps -axu 命令看到。 所以,尝试检查执行的程式,并从中恢复档案。
假设我们有一个使用 Totem 媒体播放器播放中的以 .avi 为副档名的视讯。你需要做的就是检查 Totem 的 PID,并按照本示例中提到的相同说明进行操作。
要查询正在执行的程式的 PID,请使用以下命令,后面跟程式的名称。

pidof 程式名