昨天遇到了一个面试题--如何恢复误删除的nginx日志,当时我也只是回答出了大概的思路和步骤。晚上抽时间模拟下误删除和恢复的场景。
首先大概了解下/proc目录(记得当时考试RHCA的时候,关于这个目录的题目着实不少)。Linux系统上的/proc目录是一种文件系统,即proc文件系统,它是一种伪文件系统。里面保存了当前系统内核运行状态的一些信息,可以查看到相关的系统硬件及当前正在运行进程的相关信息,也可以通过更改其中某些文件来改变内核的运行状态。/proc/PID 保存的就是当前正在运行的进程信息,PID为进程号,当进程结束后相关目录则会消失。
恢复nginx误删除的日志就要使用到/proc/PID下的某些文件,先来看下该目录下都有哪些内容:
简单列几个:
- attr 进程的属性- cmdline 启动时执行的命令- cwd 当前的工作目录,软链接- environ 进程执行使用的环境变量- fd 进程打开的所有文件,文件名为文件描述符,目录中的每个软链接都指向了进程实际打开的文件- limits 进程的软硬限制- cgroup 该进程的cgroup控制组信息- status进程的运行状态信息恢复nginx日志就是使用了fd下的某些文件描述符,因为里面每个软连接实际上都是指向了nginx运行的时候打开的文件,包括nginx的日志文件。下边模拟下误删除并恢复日志的过程。查看nginx的日志:
[root@iZ2876x9bezZ ~]# ll /var/log/nginx/ total 12 -rw-r--r-- 1 root root 6991 Aug 12 12:48 access.log -rw-r--r-- 1 root root 760 Aug 12 11:44 error.log
删除日志:
查看nginx的进程号:
查看该进程文件描述符信息:
可以看到文件描述符为5的软链接所指向的文件已经被删除,这个就是需要我们恢复的日志文件。
查看文件内容:可以看到整个日志内容,并且新增的日志内容也会增加到该文件描述符内。接下来可以将这些日志内容输出到一个文件内,然后执行nginx的reload操作,这样可以重新生成一个access.log文件,并且新的日志内容输出到该日志文件内。