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