zl程序教程

您现在的位置是:首页 >  系统

当前栏目

Linux基础命令-lsof查看进程打开的文件

Linux文件进程基础命令 查看 打开 lsof
2023-09-14 09:09:45 时间

Linux基础命令-uptime查看系统负载

Linux基础命令-top实时显示系统状态

Linux基础命令-ps查看进程状态

文件目录

前言

一 命令的介绍

二 语法及参数

2.1 使用help查看命令的语法信息

2.2 常用参数

2.2.lsof命令-i参数的条件

三 命令显示内容的含义

3.1 FD 文件描述符的类型

3.2 文件描述符后内容的含义

3.3 TYPE的文件类型

四 参考实例

3.1列出文件存在的进程

3.2 列出指定进程打开的文件

3.3 列出指定端口号进程

3.4 列出占用文件号的进程

3.5 列出指定进程号打开的文件

3.6 列出指定UID号的进程详情

3.7 列出目录下打开的文件

3.8 列出递归目录下打开的文件

3.9 显示帮助信息

3.10 使用lsof恢复被删除的文件

总结

前言

        lsof命令是个比较常用到的系统监控命令,不管是用来查看文件的进程,或者是查看进程打开的文件都是能很好用的一个工具,那么一起来学习一下。

一 命令的介绍

        lsof命令来自于英文词组“list opened files”的缩写,主要功能是用来查看文件的进程信息,此命令能够能好的帮助用户了解相关服务的运行状态,是个非常不错的系统监控工具。

        小提示:只有root用户可以使用这个命令或获取超级权限的普通用户才能使用。

二 语法及参数

2.1 使用help查看命令的语法信息

NAME
       lsof - list open files

SYNOPSIS
       lsof [ -?abChlnNOPRtUvVX ] [ -A A ] [ -c c ] [ +c c ] [ +|-d d ] [ +|-D
       D ] [ +|-e s ] [ +|-f [cfgGn] ] [ -F [f] ] [ -g [s] ] [ -i [i] ] [ -k k
       ]  [ -K k ] [ +|-L [l] ] [ +|-m m ] [ +|-M ] [ -o [o] ] [ -p s ] [ +|-r
       [t[m<fmt>]] ] [ -s [p:s] ] [ -S [t] ] [ -T [t] ] [ -u s ] [ +|-w ] [ -x
       [fl] ] [ -z [z] ] [ -Z [Z] ] [ -- ] [names]

语法:lsof 【参数】

2.2 常用参数

-a列出打开(二进制文件)存在的进程
-c<进程名>列出指定进程所打开的文件
-g列出GID号 进程的详情
-d<文件号>列出占用该文件号(FD)的进程
+d<目录>列出目录下打开的文件
+D<目录>递归列出目录下打开的文件
-n<目录>列出使用NFS的文件
-i <条件>列出符合条件的进程
-p<进程号>列出指定进程号所打开的文件
-u列出UID号进程详情
-h显示帮助信息
-v显示版本信息

2.2.lsof命令-i参数的条件

  • 协议              例如: lsof -i tcp
  • :端口             例如: lsof -i :22
  • @+IP            例如:lsof -i  @192.168.2.166
  • IPv4              例如:  lsof -i 4
  • IPv6              例如: lsof -i 6

三 命令显示内容的含义

lsof显示打开的文件及其其它内容解读

图上对应的内容以表格形式展现: 

状态栏含义
COMMAND进程的名称
PID进程的标识符号
USER进程的所有者
FD文件描述符
TYPE文件类型
DEVICE指定磁盘的名称
SIZE/OFF文件的大小
NODE文件的索引
NAME打开文件的位置

3.1 FD 文件描述符的类型

  • cwd         表示应用程序当前的工作目录
  • txt            表示它是一个可执行程序
  • mem        指的是内存的映射文件
  • 0              表示标准输出
  • 1              表示标准输入
  • 2              标准错误
  • Lnn          库引用
  • err           监狱目录(FreeBSD)
  • ltx            共享库文本(代码和数据)
  • Mxx         十六进制内存映射类型
  • m86         DOS合并映射文件
  • mmap     内存映射设备
  • pd            父目录
  • rtd            根目录
  • tr              内核跟踪文件
  • v86           VP/ix映射文件

3.2 文件描述符后内容的含义

  •  r : 表示打开文件为只读模式
  • w : 表示打开文件为写入模式
  • u :  表示打开文件是可读可写模式
  •  - :  表示当前状态被锁定
  • 空格:表示当前状态未被锁定

3.3 TYPE的文件类型

  • DIR:表示目录类型
  • CHR:表示字符类型
  • BLK:表示设备类型
  • REG:表示注册表文件

四 参考实例

3.1列出文件存在的进程

[root@localhost ~]# lsof -a /usr/bin/vim
COMMAND   PID USER  FD   TYPE DEVICE SIZE/OFF      NODE NAME
vim     10065 root txt    REG  253,0  2337208 102492147 /usr/bin/vim
vim     11403 host txt    REG  253,0  2337208 102492147 /usr/bin/vim

3.2 列出指定进程打开的文件

[root@localhost ~]# lsof -c systemd | head
COMMAND   PID USER   FD      TYPE             DEVICE SIZE/OFF       NODE NAME
systemd     1 root  cwd       DIR              253,0      224         64 /
systemd     1 root  rtd       DIR              253,0      224         64 /
systemd     1 root  txt       REG              253,0  1632960       2630 /usr/lib/systemd/systemd
systemd     1 root  mem       REG              253,0    20064      78153 /usr/lib64/libuuid.so.1.3.0
systemd     1 root  mem       REG              253,0   265576     222563 /usr/lib64/libblkid.so.1.1.0
systemd     1 root  mem       REG              253,0    90248       1780 /usr/lib64/libz.so.1.2.7
systemd     1 root  mem       REG              253,0   157424       1788 /usr/lib64/liblzma.so.5.2.2
systemd     1 root  mem       REG              253,0    23968      78215 /usr/lib64/libcap-ng.so.0.0.0
systemd     1 root  mem       REG              253,0    19896      78205 /usr/lib64/libattr.so.1.1.0

3.3 列出指定端口号进程

可以先用netstat查看服务,再用这个查看端口号进程。

[root@VM-12-17-centos ~]# netstat -antup |grep mysql
tcp6       0      0 :::3306                 :::*                    LISTEN      3609/mysqld         
[root@VM-12-17-centos ~]# lsof -i :3306
COMMAND  PID  USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
mysqld  3609 mysql   29u  IPv6 62681253      0t0  TCP *:mysql (LISTEN)

3.4 列出占用文件号的进程

由于显示的内容实在太多,加上wc -l显示一共有多少行

[root@localhost ~]# lsof -d mem |wc -l
7388

3.5 列出指定进程号打开的文件

若要查看进程号打开的文件信息,可以先用ps搜索指定的指令信息,复制进程号后到这里使用-p参数查看进程号存在的文件。

[root@localhost ~]# ps aux | grep vim
root      10065  0.0  0.1 149752  5448 pts/2    S+   19:19   0:00 vim a.sh
host      11403  0.0  0.1 149568  5204 pts/3    S+   20:05   0:00 vim 1.txt
root      11642  0.0  0.0 112824   968 pts/1    R+   20:15   0:00 grep --color=auto vim
[root@localhost ~]# lsof -p 10065 
COMMAND   PID USER   FD   TYPE DEVICE  SIZE/OFF      NODE NAME
vim     10065 root  cwd    DIR  253,0      4096  67144897 /root
vim     10065 root  rtd    DIR  253,0       224        64 /
vim     10065 root  txt    REG  253,0   2337208 102492147 /usr/bin/vim

3.6 列出指定UID号的进程详情

lsof -u参数后接UID号和用户名都是显示一样的内容。

[root@localhost ~]# lsof -u 1000
COMMAND   PID USER   FD   TYPE DEVICE  SIZE/OFF      NODE NAME
bash    11312 host  cwd    DIR  253,0       145 101340405 /home/host
bash    11312 host  rtd    DIR  253,0       224        64 /
bash    11312 host  txt    REG  253,0    964536 100664820 /usr/bin/bash
[root@localhost ~]# lsof -u host
COMMAND   PID USER   FD   TYPE DEVICE  SIZE/OFF      NODE NAME
bash    11312 host  cwd    DIR  253,0       145 101340405 /home/host
bash    11312 host  rtd    DIR  253,0       224        64 /

3.7 列出目录下打开的文件

[root@localhost ~]# lsof +d /home/host 
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
bash    11312 host  cwd    DIR  253,0      145 101340405 /home/host
vim     11403 host  cwd    DIR  253,0      145 101340405 /home/host
vim     11403 host    3u   REG  253,0    12288 101364386 /home/host/.1.txt.swp

3.8 列出递归目录下打开的文件

[root@localhost ~]# lsof +D /root
COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
gnome-ses  1945 root  cwd    DIR  253,0     4096  67144897 /root
dbus-laun  1954 root  cwd    DIR  253,0     4096  67144897 /root
dbus-daem  1955 root  cwd    DIR  253,0     4096  67144897 /root
imsetting  1984 root  cwd    DIR  253,0     4096  67144897 /root

3.9 显示帮助信息

[root@localhost ~]# lsof -h
lsof 4.87
 latest revision: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/
 latest FAQ: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ
 latest man page: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/lsof_man
 usage: [-?abhKlnNoOPRtUvVX] [+|-c c] [+|-d s] [+D D] [+|-f[gG]] [+|-e s]
 [-F [f]] [-g [s]] [-i [i]] [+|-L [l]] [+m [m]] [+|-M] [-o [o]] [-p s]
[+|-r [t]] [-s [p:s]] [-S [t]] [-T [t]] [-u s] [+|-w] [-x [fl]] [-Z [Z]] [--] [names]

3.10 使用lsof恢复被删除的文件

此命令的恢复原理是当打开一个文件,这个文件就一直是打开状态的,并且有存在于磁盘、内存当中的;直接删除文件,但进程是还在持续运行中的,在这个过程中可以尝试使用文件描述符做文件的恢复。

思路步骤

  • 1)创建一个文件
  • 2)在另外一个窗口打开文件保持一直运行的状态
  • 3)删除这个运行的文件
  • 4)使用lsof进行恢复
#测试环境centos7.6
[root@localhost ~]# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 

[root@localhost ~]# mkdir test     #创建文件
[root@localhost ~]# cd test
[root@localhost test]# cp /etc/passwd ./

#在另外一个窗口打开文件
[root@localhost test]# vim passwd
#原窗口继续 删除文件
[root@localhost test]# rm -f passwd
[root@localhost test]# lsof | grep passwd   #看到文件描述符为10r的信息
cupsd      6758                 root   10r      REG              253,0      2576   17470125 /etc/passwd
vim       13101                 root    4u      REG              253,0     12288   51866124 /root/test/.passwd.swp

#在proc目录下查找PID 6758并且文件描述符为10的文件
[root@localhost test]# head -5 /proc/6758/fd/10
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

#将文件导入一个新文件
[root@localhost test]# cat !$ > passwd.txt
cat /proc/6758/fd/10 > passwd.txt
[root@localhost test]# wc -l < passwd.txt   #显示行数
51 
[root@localhost test]# md5sum /etc/passwd passwd.txt  #inode与源文件一致,恢复成功
b1a03b88bac575860f616d09756f78d0  /etc/passwd
b1a03b88bac575860f616d09756f78d0  passwd.txt

 在文件的进程还存在的情况下,文件恢复需要知道文件名或相关信息才有很大的把握可以进行恢复。

总结

        这个命令要记的参数是挺多的,用来监控进程打开的文件信息,亦可通过这个命令来了解相关服务的运行状态等,若觉得以上内容还不错的,可以点赞支持一下!