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