【讲清楚,说明白!】干货--使用lsof恢复进程打开的文件

目录:
(一)lsof恢复文件
(二)lsof的其他用法



(一)lsof恢复文件
(1.1)如果在系统中有某个进程打开了一个文件,但是这个文件被我们误删除,此时我们希望将误删除的文件恢复。如果某个被误删除的文件所对应的进程没有关,这个文件就可以恢复。
(1.2)在Linux中的FD文件描述符与windows中的文件句柄是同样的一个概念,一个进程打开一个文件就会产生相应的文件描述符,如果这个进程将文件关闭了,那么这个文件描述符或文件句柄就会跟着释放掉了。
(1.3)我们直接执行lsof命令,可以看到如下的信息,以标红的为例,我们的sleep进程打开了/usr/lib64/ld-2.17.so库文件(图1-1)。我们也可以进行过滤,查看某一个进程打开的是哪一个文件。
# lsof | grep ^sshd


(1.4)接下来我们查看打开文件message的进程,可以看到每一个进程打开的文件。
# lsof | grep message---查看打开文件message的进程

(1.5)同时我们可以看到记录日志的进程rsyslogd有打开我们的/var/log/messages文件,其中602表示的是PID号,6w中6表示的是句柄号,w表示以写的方式,我们在/proc/602/fd目录下便可以看到句柄号6对应的文件为/var/log/messages,表示/var/log/messages文件对应的文件正在被6号句柄进程号为602的进程打开,其中rsyslogd进程的PID号为602,所以此文件正在被rsyslogd进程打开。
# lsof | grep message
# ll /proc/602/fd

(1.6)现在我们模拟不小心误删除/var/log/messages文件,接着我们通过“# ll /proc/602/fd”命令发现/var/log/messages文件显示已经被删除了
# rm -rf /var/log/messages

(1.7)由于此时我们只是文件被删除了,但是文件的句柄没有被释放,因此我们可以先通过文件描述符查看一下文件的内容是否是我们所需要的。
# lsof | grep messages---查询被删除的文件是被那个进程打开的,获取PID号和文件句柄号
# less /proc/602/fd/6---查看进程中的文件句柄信息是否是我们需要的


(1.8)我们将/proc/602/fd/6文件描述符中的内容重定向到/var/log/messages文件中。此时由于文件的状态是被删除的,但是由于文件描述符还是存在的,所以我们还是可以把文件内容找回来的。
# less /proc/602/fd/6 > /var/log/messages---将/proc/602/fd/6中的文件重定向到/var/log/messages文件中(方法一)
# cp /proc/602/fd/6 /var/log/messages---将/proc/602/fd/6中的文件拷贝到/var/log/messages文件中,不需要加-rf或者-a选项(方法二)
# vim /var/log/messages---编辑查看/var/log/messages文件

(1.9)示例:我们在系统中打开了httpd服务,然后模拟不小心删除了日志文件的情况。
# ll /etc/httpd/logs/access_log
# cat /etc/httpd/logs/access_log



(1.10)此时我们可以使用lsof命令查看被删除的access_log文件是否又被其他的进程打开,然后我们找到为root用户的打开了access_log的文件PID号和文件句柄,然后我们使用cp命令将进程打开的文件句柄中的信息拷贝并重新命名为access_log文件,此时我们发现access_log文件中已经恢复了之前删除的文件内容了。
# lsof | grep access_log---查看打开access_log文件的进程
# cp /proc/3563/fd/7 /etc/httpd/logs/access_log---将进程对应的文件描述符重命名并拷贝到access_log文件中
# cat /etc/httpd/logs/access_log



(二)lsof的其他用法
(2.1)lsof命令用于查看进程打开的文件,打开文件的进程,进程打开的端口(TCP、UDP),其中“-p <进程号>”:列出指定进程号所打开的文件。
# vim aa.txt---编辑aa.txt文件
# ps aux | grep aa.txt---通过ps命令查看进程的进程号
# lsof -p 10666---一般用于查看***进程,在读哪些文件


(2.2)其中“-i <条件>”:列出符合条件的进程。(4、6、协议、:端口、@ip)
# lsof -i :22---用于查看端口,或查看***开启的后门端口是哪个进程在使用
# lsof -i TCP---查看符合TCP协议的进程
# lsof -i @192.168.26.102---查看符合IP地址为192.168.26.102的进程

—————— 本文至此结束,感谢阅读 ——————

原文地址:https://blog.51cto.com/13613726/2461900

时间: 2024-10-07 05:30:04

【讲清楚,说明白!】干货--使用lsof恢复进程打开的文件的相关文章

lsof恢复进程打开的文件

工作原理:进程每打开文件都会生成一个文件句柄FD来标识一个文件,进程打开的文件如果没有被释放,可以通过文件句柄FD来恢复删除的文件 注意:适合恢复进程一直在打开一个文件,例如日志文件,如果配置文件进程启动的时候读取马上释放掉该文件的句柄通过这种方式是恢复不了的:同时如果打开的文件被删除掉,同时把服务重启了,服务被重启这个文件句柄也会被释放掉,通过lsof方式也是无法恢复的: 安装:yum install lsof -y 查看打开/var/log/messages文件的进程 这里打开/var/lo

s11.1 lsof:查看进程打开的文件

功能说明 lsof 全名为list open files,也就是列举系统中已经被打开的文件,通过lsof命令,就可以根据文件找到对应的进程信息,也可以根据进程信息找到进程打开的文件. [语法格式] lsof    [option] lsof    [选项] 参数选项         解释说明 -c<进程名>     显示指定的进程名所打开的文件 -p<进程号>     显示指定的进程号所打开的文件 -i            通过监听指定的协议.端-和主机等信息,显示符合条件的进程

s11.1 查看进程打开的文件

功能说明 lsof 全名为list open files,也就是列举系统中已经被打开的文件,通过lsof命令,就可以根据文件找到对应的进程信息,也可以根据进程信息找到进程打开的文件. [语法格式] lsof [option] lsof [选项] 参数选项 解释说明 -c<进程名> 显示指定的进程名所打开的文件 -p<进程号> 显示指定的进程号所打开的文件 -i 通过监听指定的协议.端-和主机等信息,显示符合条件的进程信息 -u 显示指定用户使用的文件 -U 显示所有socket文件

查看一个进程打开的文件都有哪些

step 1 pfile pid step 2 根据 inode number 查找 比如 bash-2.05# pfiles 26053 26053: python Current rlimit: 256 file descriptors 0: S_IFCHR mode:0620 dev:32,0 ino:3982 uid:0 gid:7 rdev:24,2 O_RDWR|O_NOCTTY|O_LARGEFILE 1: S_IFCHR mode:0620 dev:32,0 ino:3982 u

查询进程打开的文件[转]

fuser 有的时候我想要知道我的程序到底在这次启动过程中开启了多少文件,可以利用 fuser 来观察啦! 举例来说,你如果卸载时发现系统通知:『 device is busy 』,那表示这个文件系统正在忙碌中, 表示有某支程序有利用到该文件系统啦!那么你就可以利用 fuser 来追踪罗!fuser 语法有点像这样: [[email protected] ~]# fuser [-umv] [-k [i] [-signal]] file/dir 选项与参数: -u :除了程序的 PID 之外,同时

Unix 线程共享创建进程打开的文件资源(1)

执行环境:Linux ubuntu 4.4.0-31-generic #50-Ubuntu SMP Wed Jul 13 00:07:12 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux 1. 测试代码 : a.c 1 #include <fcntl.h> 2 #include <unistd.h> 3 #include <stdio.h> 4 #include <pthread.h> 5 #include <strin

通过文件查进程,通过进程查打开的文件等等

fuser - 文件.目录.sockets去找出使用它们的程序 在卸载某个usb的时候,提示设备忙,这个时候就可以使用fuser -k directory 来杀死占用usb路径下的进程,然后再卸载就ok了. 也可以使用fuser -k directory 查看这个文件系统.或sockets等等,被多少程序所使用. lsof - 列出打开的文件.可以查询某个程序开启或者使用的文件与设备 1. lsof abc.txt 显示开启文件abc.txt的进程 2. lsof -i :22 知道22端口现在

C/C++ 父子进程之间的文件描述符问题

在C程序中,文件由文件指针或者文件描述符表示.ISO C的标准I/0库函数(fopen, fclose, fread, fwrite, fscanf, fprintf等)使用文件指针,UNIX的I/O函数(open, close, read, write, ioctl)使用文件描述符.下面重点来说下,文件描述符是如何工作的. 文件描述符相当于一个逻辑句柄,而open,close等函数则是将文件或者物理设备与句柄相关联.句柄是一个整数,可以理解为进程特定的文件描述符表的 索引.先介绍下面三个概念,

进程的proc文件系统信息

一.实验代码 #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> void main() { int fd; char buf = '1'; char *pname = "/home/sfl/mytest/proc_test/abc/aaa.txt"; fd = open(p