一次线上nohup.out日志丢失的问题

  今天有小伙伴求助,线上一个应用的nohup.out日志不更新了,但进程还是正常的。此时需要查看这个日志排查一些问题,这可怎么办呢?

  nohup.out文件的更新时间停留在了昨天9点36,日志也刚好打到这个时间点。

  但后面的日志去哪里了呢?这个问题就优点难办了,原因可能很多。比如不小心把文件删除了,或者重命名了。

  那现在没时间找原因,能不能紧急把日志恢复呢?或者说在不重启进程的情况下,把日志找回来呢?

  方法是有的,不过得从linux的/proc目录说起。

  先来看看/proc目录的作用:

/proc文件系统下的多种文件提供的系统信息不是针对某个特定进程的,而是能够在整个系统范围的上下文中使用。可以使用的文件随系统配置的变化而变化。命令procinfo能够显示基于其中某些文件的多种系统信息。以下详细描述/proc下的文件。

/proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。用户和应用程序可以通过 proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是 动态从系统内核读出所需信息并提交的。

  简单来说,/proc目录下存放所有进程的所有信息,当然也包括进程当前打开的文件信息。通过ps命令找到对应进程的PID,先来看看这个进程对应目录都有哪些信息。

  可以看到该目录下面的文件、子目录也还是比较多的。从问题出发,我们只需要关注fd目录,这个目录报错当前进程相关的所有文件信息(注意不仅仅是普通文件,还有socket等信息)。

  来搜一下有没有nohup.out,居然真的有!但为啥显示是deleted呢?鬼才知道,难道不是小伙伴自己私下操作了还不承认么?

  都显示deleted了,怎么恢复呢?大家有没有看到这是一个软连接呢?软连接就是对原文件的一个连接,原文件删除时,只要软连接不删除,文件就不会被物理删除。

  通过tail命令,居然有最新的日志内容!!!head命令看下呢?进程启动时候的日志也是有的。

  是不是比较惊喜?这个目录居然有进程启动以来所有的日志?那么是不是可以恢复从昨天到现在所有的日志了呢?当然,这个日志文件太大了,我们只需要昨天到现在的日志。可以 用tail -200000 /proc/55160/fd/1把日志打印到另一个文件。至此,日志就全都找回来了。

  我们总计一下解决这个问题的步骤:

  1、通过ps命令找到进程的pid

  2、去/proc目录下,找到进程打开的文件。ls -l /proc/${pid}/fd

  3、/proc/${pid}/fd目录下找到丢失的文件。进行紧急修复

 

 

 

1、 Linux中/proc目录下文件详解

 

posted @ 2019-12-26 11:40  gabry.wu  阅读(2083)  评论(4编辑  收藏  举报