进程 ID 为 2147 的进程正在运行,但找不到其日志文件。文件系统为 ext3,剩余 100MB 空间。进程 2147 中没有出现任何问题。进程 2147 的 lsof 显示日志文件仍处于打开状态。
a. 可能发生了什么事情导致日志文件消失?
b. 你能访问文件的内容吗?如果可以,如何访问?
答案1
Ad a)。该文件已被删除,可能是由进程 2147 本身删除的。如果您需要一个临时文件(而不是日志文件)来创建文件,获取它的句柄,然后删除它,这是一种常见的做法。删除将删除创建文件的目录中的条目,因此其他进程无法访问它。一个方便的暂存器,没有人可以查看。当进程关闭文件并且没有更多句柄时,文件系统将把暂存器文件数据占用的块标记为未使用。如果它真的是一个日志文件,它可能已被删除(例如意外),因此该进程仍会写入其日志,但没有其他人可以读取它(想想:只写内存 ;))。
Ad b) 您无法以正常方式访问文件内容,即以正常方式访问文件系统。您必须开始访问文件系统下面的数据,寻找保存暂存器数据的块。如果您想尝试这样做,请在杀死 2147 后立即以只读方式挂载保存已删除文件的文件系统,否则一旦 2147 退出,您将面临数据被覆盖的风险,保存其数据的块将被标记为未使用。如何准确找到您需要的数据块?抱歉,无法帮助您 :(。
答案2
该文件可能已被删除吗?如果您在 Linux 上删除一个文件,而某个进程仍打开了该文件的句柄,那么该文件在文件系统上将不可见,但仍将保持打开状态,直到该进程退出。
答案3
如果日志文件所在的目录已被上装(该目录或其父目录之一已被用作挂载点),则您可能看不到日志文件。只有在挂载发生之前打开了日志文件描述符,并且文件描述符尚未关闭(即程序不会在每次输入后关闭日志文件并重新打开它以写入后续条目)的情况下,才会出现这种情况。
mount
如果发生这种情况,命令的输出和之间会存在一些差异/proc/2147/mounts
。您可能(我猜)能够访问过度安装的文件(一个大可能) 通过 中的文件描述符链接/proc/2147/fd
。
答案4
正如所提到的重新链接已删除的文件,您可以使用/proc/<pid>/fd/N
lsof 获取打开文件描述符的副本并将数据复制出来。另请参阅使用 lsof 恢复已删除的文件。请注意,您应该让原始进程停止写入文件描述符(例如停止进程)。另外,在我看来,您需要将 lseek 移到文件描述符上的位置 0(需要一些代码),但我没有任何文章提到它,所以也许我弄错了。
第一篇文章还提到了使用稍微危险一些的技术debugfs
。