在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件、目录文件、链接文件和设备文件。文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符。程序刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误。如果此时去打开一个新的文件,它的文件描述符会是3。当完成任务后,再通过调用系统函数来关闭该文件。
任务1 lsof查看打开/var/log/messages文件的进程
[root@f ~]# lsof -l /var/log/messages

使用lsof恢复进程打开的误删除文件_lsof


任务2 使用cp备份后用rm模拟误删除[root@f ~]# cp /var/log/messages /var/log/messages.bak

[root@f ~]# rm /var/log/messages

rm: remove regular file ‘/var/log/messages’? y

[root@f ~]# cp /var/log/messages.bak /var/log/messages

[root@f ~]# ls -lh /var/log/messages

使用lsof恢复进程打开的误删除文件_文件描述符_02


使用lsof恢复进程打开的误删除文件_文件描述符_03


任务3 lsof再次查看message文件的状态

此处重启,再查看

[root@f ~]# lsof -l /var/log/messages

使用lsof恢复进程打开的误删除文件_重启_04

任务4 查看相应进程的文件描述符FD

由lsof可以知道messages的进程的893,FD为3W

使用ls 即可知道messages所连接的文件进程

[root@f ~]# ls -lh /proc/893/fd/

[root@f ~]# cat /proc/893/fd/3

使用lsof恢复进程打开的误删除文件_lsof_05


使用lsof恢复进程打开的误删除文件_centos_06

任务5 通过文件描述符查看文件的内容并恢复
重启之后查看messages的进程号,删除并恢复

[root@f ~]# lsof -l /var/log/messages
[root@f ~]# rm -rf /var/log/messages
[root@f ~]# cat /proc/893/fd/3 > /var/log/messages
[root@f ~]# head /var/log/messages

使用lsof恢复进程打开的误删除文件_文件描述符_07