由进程ID 2147标识的进程正在运行,但其日志文件无处可查。 文件系统是ext3和100MB的空间。 在进程2147中没有出错。进程2147的一个显示日志文件仍然是打开的。
一个。 可能发生什么使日志文件消失?
湾 你可以访问文件的内容? 如果是这样,怎么样?
广告a)。 该文件被删除,可能由进程2147本身。 如果你需要一个临时文件(不是日志文件)来创build一个文件,得到一个句柄然后删除它,这是一种常见的做法。 删除将删除创build文件的目录中的条目,所以其他进程不可能访问它。 一个方便的便笺簿,没有人可以看看。 当进程closures文件并且没有更多的句柄时,文件系统将把暂存器文件数据占用的块标记为未使用。 如果它确实是一个日志文件,它可能已经被删除了(例如偶然),所以这个进程仍然写入它的日志,但没有其他人可以读取它(想想:只写内存;))。
b)不能以正常方式访问文件的内容,即以正常方式访问文件系统。 您将不得不开始访问文件系统下的数据,查找保存暂存器数据的块。 如果你想尝试,那么一旦你杀死了2147,挂载保存已删除文件的文件系统,或者一旦2147退出,冒着数据被覆盖的危险,并且保存其数据的块将被标记为未使用。 如何find你需要的数据块? 对不起,不能帮助你在那里:(。
文件是否被删除了? 如果在Linux上删除一个进程仍然打开了句柄的文件,那么在文件系统上它将不可见,但是在进程退出之前它仍然保持打开状态。
如果日志文件所在的目录已超载 (该目录或其父目录之一已用作挂载点),则可能看不到日志文件。 这只有在挂载发生之前打开日志文件描述符并且文件描述符未被closures(即程序在每个条目之后没有closures日志文件并重新打开它以写入后续条目)时才可能。
如果发生这种情况, mount命令的输出和/proc/2147/mounts之间会有一些差异。 你可能(我猜测)能够通过/proc/2147/fd文件描述符链接来访问over-mounted文件(一个很大的可能 )。
正如重新链接已删除的文件所述 ,您可以使用lsof中的/proc/<pid>/fd/N来获取打开的文件描述符的副本并将数据复制出来。 另请参阅使用lsof回收删除的文件 。 请注意,您应该使原始进程停止写入文件描述符(例如,停止进程)。 另外,在我看来,你想要在文件描述符上定位0(需要一些代码),但是我没有任何文章提及它,所以也许我错了。
第一篇文章也提到了使用debugfs风险较高的技巧。