Linux恢复删除文件的lsof命令详解

lsof命令

lsof命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需要root用户执行。

在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。

语法

lsof(选项)

参数

-a:列出打开文件存在的进程;

-c<进程名>:列出指定进程所打开的文件;

-g:列出GID号进程详情;

-d<文件号>:列出占用该文件号的进程;

+d<目录>:列出目录下被打开的文件;

+D<目录>:递归列出目录下被打开的文件;

-n<目录>:列出使用NFS的文件;

-i<条件>:列出符合条件的进程。(4、6、协议、:端口、 @ip )

-p<进程号>:列出指定进程号所打开的文件;

-u:列出UID号进程详情;

-h:显示帮助信息;

-v:显示版本信息。

使用

查看

lsof -i :(端口) 查看这个端口有那些进程在访问,比如22端口

shell> lsof -i:22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd  1939 root 3u IPv4 12317  0t0 TCP *:ssh (LISTEN)
sshd  1939 root 4u IPv6 12321  0t0 TCP *:ssh (LISTEN)
sshd  2790 root 3u IPv4 15229  0t0 TCP 192.168.178.128:ssh->192.168.178.1:64601 (ESTABLISHED)
sshd  2824 root 3u IPv4 15528  0t0 TCP 192.168.178.128:ssh->192.168.178.1:64673 (ESTABLISHED)
sshd  2990 root 3u IPv4 15984  0t0 TCP 192.168.178.128:ssh->192.168.178.1:64686 (ESTABLISHED)
sshd 14695 root 3u IPv4 39558  0t0 TCP 192.168.178.128:ssh->192.168.178.1:49662 (ESTABLISHED)

lsof输出各列信息的意义如下:

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

恢复文件

利用lsof可以恢复一些系统日志,前提是这个进程必须存在。这里就拿最常用的/var/log/messages来举例说明,大家在做测试的时候最好先备份一下。

#备份
shell> cp /var/log/message /var/log/message_bac
http://embeddedlinux.org.cn/
shell> lsof |grep /var/log/message
rsyslogd 1737  root 1w  REG    8,2 5716123  652638 /var/log/messages

进程在运行中,接下来我就把/var/log/messages这个文件删掉

shell> rm /var/log/messages

删掉之后,我再来看看这个进程的变化

shell> lsof |grep /var/log/messages
rsyslogd 1737  root 1w  REG    8,2 5716123  652638 /var/log/messages (deleted)

大家看到有变化了吧, 对比两个之后发现多了(deleted)。要找到这个文件在哪还要看看这个

PID:1737 FD:1 那我们有直接进入/proc/1737/FD/1用ll查看一下

shell> cd /proc/1737/fd/
shell> ll

total 0
lrwx------ 1 root root 64 Dec 23 13:00 0 -> socket:[11442]
l-wx------ 1 root root 64 Dec 23 13:00 1 -> /var/log/messages (deleted)
l-wx------ 1 root root 64 Dec 23 13:00 2 -> /var/log/secure
lr-x------ 1 root root 64 Dec 23 13:00 3 -> /proc/kmsg
l-wx------ 1 root root 64 Dec 23 13:00 4 -> /var/log/maillog

看到了1对应/var/log/messages (deleted),看看文件是不是我们要的文件:

shell> head -5 1
Nov 14 03:11:11 localhost kernel: imklog 5.8.10, log source = /proc/kmsg started.
Nov 14 03:11:11 localhost rsyslogd: [origin software="rsyslogd" swVersion="5.8.10" x-pid="1241" x-info="http://www.rsyslog.com"] start
Nov 14 03:11:11 localhost kernel: Initializing cgroup subsys cpuset
Nov 14 03:11:11 localhost kernel: Initializing cgroup subsys cpu
Nov 14 03:11:11 localhost kernel: Linux version 2.6.32-431.el6.x86_64 (mockbuild@c6b8.bsys.dev.CentOS.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Fri Nov 22 03:15:09 UTC 2013

对比备份文件:

shell> head -5 /var/log/message_bac
Nov 14 03:11:11 localhost kernel: imklog 5.8.10, log source = /proc/kmsg started.
Nov 14 03:11:11 localhost rsyslogd: [origin software="rsyslogd" swVersion="5.8.10" x-pid="1241" x-info="http://www.rsyslog.com"] start
Nov 14 03:11:11 localhost kernel: Initializing cgroup subsys cpuset
Nov 14 03:11:11 localhost kernel: Initializing cgroup subsys cpu
Nov 14 03:11:11 localhost kernel: Linux version 2.6.32-431.el6.x86_64 (mockbuild@c6b8.bsys.dev.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Fri Nov 22 03:15:09 UTC 2013

对比发现数据是一样的,恢复

shell> cat 1 > /var/log/messages

再次提醒,恢复前提是这个进程必须存在。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

(0)

相关推荐

  • linux 中的ls命令参数详解及ls命令的使用实例

    一.ls命令参数详解 可以通过阅读 ls 的说明书页(man ls)来获得选项的完整列表. -a – 全部(all).列举目录中的全部文件,包括隐藏文件(.filename).位于这个列表的起首处的 .. 和 . 依次是指父目录和你的当前目录. -l – 长(long).列举目录内容的细节,包括权限(模式).所有者.组群.大小.创建日期.文件是否是到系统其它地方的链接,以及链接的指向. -F – 文件类型(File type).在每一个列举项目之后添加一个符号.这些符号包括:/ 表明是一个目录:

  • linux ls命令教程及ls命令使用方法

    ls命令按文件大小查看文件 a.降序:ls -lsh moudaen@morton:~$ ls -lsh total 20M 20M -rw-r--r-- 1 moudaen 65536 20M Nov 11 17:44 Gender.war 4.0K drwxr-xr-x 2 moudaen 65536 4.0K Nov 11 17:44 test 8.0K -rw-r--r-- 1 moudaen 65536 5.2K Nov 11 11:44 MyApp.java 命令解释: ls后面的三

  • 详解如何在Linux(CentOS 7)命令行模式安装VMware Tools

    本例中为在Linux(以CentOS 7为例)安装VMware Tools. 1.首先启动CentOS 7,在VMware中点击上方"VM",点击"Install VMware Tools..."(如已安装则显示"Reinstall VMware Tools..."). 2.在命令行输入"ls /dev"查看. 3.输入"mkdir /mnt/cdrom"在/mnt目录下新建一个名为cdrom的文件夹. 4

  • Linux ls命令参数详解

    -a -- 全部(all).列举目录中的全部文件,包括隐藏文件(.filename).位于这个列表的起首处的 .. 和 . 依次是指父目录和你的当前目录.      -l -- 长(long).列举目录内容的细节,包括权限(模式).所有者.组群.大小.创建日期.文件是否是到系统其它地方的链接,以及链接的指向.      -F -- 文件类型(File type).在每一个列举项目之后添加一个符号.这些符号包括:/ 表明是一个目录:@ 表明是到其它文件的符号链接:* 表明是一个可执行文件.    

  • linux lsof命令详解及实例

    linux lsof命令详解 简介 lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件.所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口.因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过

  • linux c模拟ls命令详解

    复制代码 代码如下: /* 模拟ls命令,实现参数-tariRl.有些代码重复出现,可改进 可以在该程序的基础上增加参数,该程序思路清晰,容易扩展 */#include<stdio.h>#include<string.h>#include<stdlib.h>#include<sys/types.h>#include<unistd.h>#include<sys/stat.h>#include<dirent.h>#includ

  • linux 中ls命令详解

    ls命令用来显示目标列表,在Linux中是使用率较高的命令.ls命令的输出信息可以进行彩色加亮显示,以分区不同类型的文件. 语法 ls(选项)(参数) 选项 -a:显示所有档案及目录(ls内定将档案名或目录名称为“.”的视为影藏,不会列出): -A:显示除影藏文件“.”和“..”以外的所有文件列表: -C:多列显示输出结果.这是默认选项: -l:与“-C”选项功能相反,所有输出信息用单列格式输出,不输出为多列: -F:在每个输出项后追加文件的类型标识符,具体含义:“*”表示具有可执行权限的普通文

  • 浅谈Linux中的chattr与lsattr命令

    PS:有时候你发现用root权限都不能修改某个文件,大部分原因是曾经用chattr命令锁定该文件了.chattr命令的作用很大,其中一些功能是由Linux内核版本来支持的,不过现在生产绝大部分跑的linux系统都是2.6以上内核了.通过chattr命令修改属性能够提高系统的安全性,但是它并不适合所有的目录.chattr命令不能保护/./dev./tmp./var目录.lsattr命令是显示chattr命令设置的文件属性. 这两个命令是用来查看和改变文件.目录属性的,与chmod这个命令相比,ch

  • linux中ls命令使用详解

    ls命令是linux下最常用的命令.ls命令就是list的缩写缺省下ls用来打印出当前目录的清单如果ls指定其他目录那么就会显示指定目录里的文件及文件夹清单. 通过ls 命令不仅可以查看linux文件夹包含的文件而且可以查看文件权限(包括目录.文件夹.文件权限)查看目录信息等等.ls 命令在日常的linux操作中用的很多! 1. 命令格式: ls [选项] [目录名] 2. 命令功能: 列出目标目录中所有的子目录和文件. 3. 常用参数: -a, –all 列出目录下的所有文件,包括以

  • Linux恢复删除文件的lsof命令详解

    lsof命令 lsof命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP.UDP).找回/恢复删除的文件.是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需要root用户执行. 在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件.所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操

  • Linux常用ls, alias基础命令详解

    ls命令 作用:列举目录文件信息( list directory content ) 格式:ls [option] [file] 1,命令不跟任何选项与目录,表示列举当前目录的文件信息 ghostwu@dev:~$ ls Desktop examples.desktop linux Pictures python Videos Documents git_test Music project software Downloads info php Public Templates 2,ls -l

  • Linux应用调试之strace命令详解

    1.strace简介 strace常用来跟踪进程执行时的系统调用和所接收的信号. 通过strace可以知道应用程序打开了哪些文件,以及读写了什么内容,包括消耗的时间以及返回值等.在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通 过系统调用访问硬件设备.strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间. 2.安装strace命令 首先需要以下两个文件: strace-4.5

  • Linux中grep和egrep命令详解

    rep / egrep 语法: grep  [-cinvABC]  'word'  filename -c :打印符合要求的行数 -i :忽略大小写 -n :在输出符合要求的行的同时连同行号一起输出 -v :打印不符合要求的行 -A :后跟一个数字(有无空格都可以),例如 A2则表示打印符合要求的行以及下面两行 -B :后跟一个数字,例如 B2 则表示打印符合要求的行以及上面两行 -C :后跟一个数字,例如 C2 则表示打印符合要求的行以及上下各两行 把包含 'halt' 的行以及这行下面的两行

  • 一天一个shell命令 linux好管家-磁盘-du命令详解

    du命令 磁盘管理 du命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的. 语法 du [选项][文件] 选项 -a或-all 显示目录中个别文件的大小. -b或-bytes 显示目录或文件大小时,以byte为单位. -c或--total 除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和. -k或--kilobytes 以KB(1024bytes)为单位输出. -m或--megabytes 以MB为单位

  • 一天一个shell命令 linux文本操作系列-tree命令详解

    tree命令是以图形化的树结构打印文件和目录的主角.通常linux发行版本中并没有包括这个命令.你需要用包管理器自行安装. 实例: 1. tree 打印当前目录下所有文件 2. tree –p ${dir} 打印dir目录下所有文件,以及他们的权限 3. tree –h ${dir} 打印dir目录下所有文件,以及适读的大小 4. tree path –P "*.sh" 打印所有.sh结尾的文件 5. tree path –H http://localhost –o out.html

  • 一天一个shell命令 linux好管家--磁盘--df命令详解

    df命令 磁盘管理 df命令用于显示磁盘分区上的可使用的磁盘空间.默认显示单位为KB.可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息. 语法 df(选项)(参数) 选项 -a或--all:包含全部的文件系统: --block-size=<区块大小>:以指定的区块大小来显示区块数目: -h或--human-readable:以可读性较高的方式来显示信息: -H或--si:与-h参数相同,但在计算时是以1000 Bytes为换算单位而非1024 Bytes: -i或--inod

  • linux中 关于screen 的命令详解

    一.背景 系统管理员经常需要SSH 或者telent 远程登录到Linux 服务器,经常运行一些需要很长时间才能完成的任务,比如系统备份.ftp 传输等等.通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为它们执行的时间太长了.必须等待它们执行完毕,在此期间不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了. 二.简介 GNU Screen是一款由GNU计划开发的用于命令行终端切换的自由软件.用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换. GNU

  • Linux监视进程之ps命令详解

    本文参考<UNIX/Linux系统管理技术手册>. 操作系统:Debian8.5 仅仅以下常用的三种组合命令的解释,更加齐全的命令请自行ps --help all 查看. 一.ps -ef 输出展示: UID PID PPID C STIME TTY TIME CMD root 1 0 0 2016 ? 00:00:28 /lib/systemd/systemd --system --deserialize 15 root 2 0 0 2016 ? 00:00:00 [kthreadd] ro

随机推荐