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用户可以使用这个命令或获取超级权限的普通用户才能使用。
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]] ] [ -s [p:s] ] [ -S [t] ] [ -T [t] ] [ -u s ] [ +|-w ] [ -x
[fl] ] [ -z [z] ] [ -Z [Z] ] [ -- ] [names]
语法:lsof 【参数】
-a | 列出打开(二进制文件)存在的进程 |
-c<进程名> | 列出指定进程所打开的文件 |
-g | 列出GID号 进程的详情 |
-d<文件号> | 列出占用该文件号(FD)的进程 |
+d<目录> | 列出目录下打开的文件 |
+D<目录> | 递归列出目录下打开的文件 |
-n<目录> | 列出使用NFS的文件 |
-i <条件> | 列出符合条件的进程 |
-p<进程号> | 列出指定进程号所打开的文件 |
-u | 列出UID号进程详情 |
-h | 显示帮助信息 |
-v | 显示版本信息 |
lsof显示打开的文件及其其它内容解读
图上对应的内容以表格形式展现:
状态栏 | 含义 |
COMMAND | 进程的名称 |
PID | 进程的标识符号 |
USER | 进程的所有者 |
FD | 文件描述符 |
TYPE | 文件类型 |
DEVICE | 指定磁盘的名称 |
SIZE/OFF | 文件的大小 |
NODE | 文件的索引 |
NAME | 打开文件的位置 |
[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
[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
可以先用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)
由于显示的内容实在太多,加上wc -l显示一共有多少行
[root@localhost ~]# lsof -d mem |wc -l
7388
若要查看进程号打开的文件信息,可以先用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
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 /
[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
[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
[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]
此命令的恢复原理是当打开一个文件,这个文件就一直是打开状态的,并且有存在于磁盘、内存当中的;直接删除文件,但进程是还在持续运行中的,在这个过程中可以尝试使用文件描述符做文件的恢复。
思路步骤
#测试环境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
在文件的进程还存在的情况下,文件恢复需要知道文件名或相关信息才有很大的把握可以进行恢复。
这个命令要记的参数是挺多的,用来监控进程打开的文件信息,亦可通过这个命令来了解相关服务的运行状态等,若觉得以上内容还不错的,可以点赞支持一下!