linux学习之lsof用法,恢复误删除的文件

一. 简介

lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件

二. 常用命令

lsof filename 查看打开filename文件的所有进程
lsof -p procid 查看进程ID为procid的进程打开的文件列表
lsof -c command 查看进程名称为command的进程打开的文件列表

默认 : 没有选项,lsof列出活跃进程的所有打开文件
组合 : 可以将选项组合到一起,如-abc,但要当心哪些选项需要参数
-a : 结果进行“与”运算(而不是“或”)
-l : 在输出显示用户ID而不是用户名
-h : 获得帮助
-t : 仅获取进程ID
-U : 获取UNIX套接口地址
-F : 格式化输出结果,用于其它命令。可以通过多种方式格式化,如
-F pcfn(用于进程id、命令名、文件描述符、文件名,并以空终止)

三. 输出信息含义

[root@VM_0_3_centos ~]# lsof|more
COMMAND     PID   TID           USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
systemd       1                 root  cwd       DIR              253,1      4096          2 /
systemd       1                 root  rtd       DIR              253,1      4096          2 /
systemd       1                 root  txt       REG              253,1   1628544      12011 /usr/lib/systemd/systemd
systemd       1                 root  mem       REG              253,1     20064      22366 /usr/lib64/libuuid.so.1.3.0
systemd       1                 root  mem       REG              253,1    265576       5031 /usr/lib64/libblkid.so.1.1.0
systemd       1                 root  mem       REG              253,1     90248       4230 /usr/lib64/libz.so.1.2.7
systemd       1                 root  mem       REG              253,1    157424       4993 /usr/lib64/liblzma.so.5.2.2
systemd       1                 root  mem       REG              253,1     23968       5358 /usr/lib64/libcap-ng.so.0.0.0
systemd       1                 root  mem       REG              253,1     19896       4329 /usr/lib64/libattr.so.1.1.0
systemd       1                 root  mem       REG              253,1     19248      22114 /usr/lib64/libdl-2.17.so
systemd       1                 root  mem       REG              253,1    402384       4410 /usr/lib64/libpcre.so.1.2.0
systemd       1                 root  mem       REG              253,1   2156240       3910 /usr/lib64/libc-2.17.so
systemd       1                 root  mem       REG              253,1    142144       3936 /usr/lib64/libpthread-2.17.so
systemd       1                 root  mem       REG              253,1     88776         13 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
systemd       1                 root  mem       REG              253,1     43712      22121 /usr/lib64/librt-2.17.so
systemd       1                 root  mem       REG              253,1    277792       5651 /usr/lib64/libmount.so.1.1.0
systemd       1                 root  mem       REG              253,1     91800       4291 /usr/lib64/libkmod.so.2.2.10
systemd       1                 root  mem       REG              253,1    127184       5361 /usr/lib64/libaudit.so.1.0.0
systemd       1                 root  mem       REG              253,1     61680       8506 /usr/lib64/libpam.so.0.83.1

COMMAND:进程的名称
PID:进程标识符
USER:进程所有者
FD:文件描述符,应用程序通过文件描述符识别该文件,如cwd、txt等
TYPE:文件类型,如DIR、REG等
DEVICE:指定磁盘的名称
SIZE:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称

四、 误删除文件操作

比如不小心把安装的tomcat目录下log日志给删除了

[message@VM_0_3_centos logs]$ rm -f catalina.out

这时候服务器正常运行啊,不报错。因为服务器打印日志是真的修改的硬盘,我们删除的是文件访问的路径,可以理解成指针。

先找到这个进程PID

[message@VM_0_3_centos logs]$ ps -ef|grep tomcat-m
message   3329  2774  0 14:02 pts/5    00:00:00 grep --color=auto tomcat-m
message  14121     1  0 Nov11 ?        00:01:56 /opt/java/jdk1.8.0_161/bin/java -Djava.util.logging.config.file=/home/message/tomcat-message/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /home/message/tomcat-message/bin/bootstrap.jar:/home/message/tomcat-message/bin/tomcat-juli.jar -Dcatalina.base=/home/message/tomcat-message -Dcatalina.home=/home/message/tomcat-message -Djava.io.tmpdir=/home/message/tomcat-message/temp org.apache.catalina.startup.Bootstrap start

可以看到这个tomcat运行pid是14121,lsof查看这个PID打开的文件,找到catalina.out访问的文件

[message@VM_0_3_centos logs]$ lsof -p 14121|grep catalina.out
java    14121 message    1w      REG              253,1   7436750   655896 /home/message/tomcat-message/logs/catalina.out (deleted)
java    14121 message    2w      REG              253,1   7436750   655896 /home/message/tomcat-message/logs/catalina.out (deleted)

还有一个位置能访问这个catalina.out文件,在/proc/14121/fd下有两个文件1和2都能访问这个文件,可以看到这个文件还在硬盘中

[root@VM_0_3_centos fd]# head -10 1
06-Nov-2020 14:22:59.249 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name:   Apache Tomcat/8.5.50
06-Nov-2020 14:22:59.263 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          Dec 7 2019 19:19:46 UTC
06-Nov-2020 14:22:59.263 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version number: 8.5.50.0
06-Nov-2020 14:22:59.263 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Linux
06-Nov-2020 14:22:59.263 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version:            3.10.0-1062.9.1.el7.x86_64
06-Nov-2020 14:22:59.264 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture:          amd64
06-Nov-2020 14:22:59.264 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home:             /opt/java/jdk1.8.0_161/jre
06-Nov-2020 14:22:59.264 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version:           1.8.0_161-b12
06-Nov-2020 14:22:59.264 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor:            Oracle Corporation
06-Nov-2020 14:22:59.264 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE:         /home/message/tomcat-message

在Linux系统中,每个运行中的程序都有一个宿主进程彼此隔离,以/proc/进程号来体现(Linux本质上就是一个文件系统),比如:ls -l /proc/13067 查看进程PID为13067的进程信息;当程序运行时,操作系统会专门开辟一块内存区域,提供给当前进程使用,对于依赖的文件,操作系统会发放一个文件描述符,以便读写文件,当我们执行 rm -f 删除文件时,其实只是删除了文件的目录索引节点,对于文件系统不可见,但是对于打开它的进程依然可见,即仍然可以使用先前发放的文件描述符读写文件,正是利用这样的原理,所以我们可以使用I/O重定向的方式来恢复文件。

[message@VM_0_3_centos fd]$ cat 1 > ~/tomcat-message/logs/catalina.out

查看下文件

[message@VM_0_3_centos logs]$ ll
total 8268
-rw-r----- 1 message message   55171 Nov  6 23:30 catalina.2020-11-06.log
-rw-r----- 1 message message   31215 Nov  7 23:30 catalina.2020-11-07.log
-rw-r----- 1 message message   30906 Nov  8 23:30 catalina.2020-11-08.log
-rw-r----- 1 message message   48009 Nov  9 23:30 catalina.2020-11-09.log
-rw-r----- 1 message message   89007 Nov 10 23:30 catalina.2020-11-10.log
-rw-r----- 1 message message  173734 Nov 11 23:30 catalina.2020-11-11.log
-rw-r----- 1 message message   68646 Nov 12 14:20 catalina.2020-11-12.log
-rw-rw-r-- 1 message message 7443687 Nov 12 14:22 catalina.out

此时杀进程重启tomcat服务,以前的日志就不会丢失了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值