在linux下,一切皆文件。
再linux下文件删除了。但是被某个进程打开,句柄还没有释放,文件其实还是没有被删除的 。
$ lsof |grep deleted
Xorg 1131 root 125u REG 0,5 4 61026 /memfd:xshmfence (deleted)
Xorg 1131 root 126u REG 0,5 4 62913 /memfd:xshmfence (deleted)
Xorg 1131 root 129u REG 0,5 4 74609 /memfd:xshmfence (deleted)
前面我们可以找到被删除但是仍然被打开的文件,实际上文件并没有真正的消失,如果是意外被删除的,我们还有手段恢复它。以/var/log/syslog文件为例,我们先删除它
rm /var/log/syslog
然后使用lsof查看那个进程打开了该文件:
$ lsof |grep syslog rs:main 993 1119 syslog 5w REG 8,10 78419 528470 /var/log/syslog (deleted)
可以找到进程id为993的进程打开了该文件,我们知道每个进程在/proc下都有文件描述符打开的记录:
$ ls -l /proc/993/fd lr-x------ 1 root root 64 3月 5 18:30 0 -> /dev/null l-wx------ 1 root root 64 3月 5 18:30 1 -> /dev/null l-wx------ 1 root root 64 3月 5 18:30 2 -> /dev/null lrwx------ 1 root root 64 3月 5 18:30 3 -> socket:[15032] lr-x------ 1 root root 64 3月 5 18:30 4 -> /proc/kmsg l-wx------ 1 root root 64 3月 5 18:30 5 -> /var/log/syslog (deleted) l-wx------ 1 root root 64 3月 5 18:30 6 -> /var/log/auth.log
这里就找到了被删除的syslog文件,文件描述符是5,我们把它重定向出来:
$ cat /proc/993/fd/5 > syslog $ ls -al /var/log/syslog -rw-r--r-- 1 root root 78493 3月 5 19:22 /var/log/syslog
这样我们就恢复了syslog文件。