今天有小伙伴求助,線上一個應用的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目錄下找到丟失的文件。進行緊急修復