简单来讲 lsof是一个可以查看进程打开文件的情况的命令 日常运维工作中 使用到的场景有很多
而之所以lsof命令这么强大 就是因为在linux中 一切皆文件
-
简单介绍
命令安装:
如果你的linux没有lsof命令 yum install lsof 安装就好
参数介绍:
默认 : 没有选项,lsof列出活跃进程的所有打开文件
组合 : 可以将选项组合到一起,如-abc,但要当心哪些选项需要参数
-a 列出打开文件存在的进程
-c<进程名> 列出指定进程所打开的文件
-g 列出GID号进程详情
-d<文件号> 列出占用该文件号的进程
+d<目录> 列出目录下被打开的文件
+D<目录> 递归列出目录下被打开的文件
-n<目录> 列出使用NFS的文件
-i<条件> 列出符合条件的进程。(4、6、协议、:端口、 @ip )
-p<进程号> 列出指定进程号所打开的文件
-u 列出UID号进程详情
-h 显示帮助信息
-v 显示版本信息
-t 仅获取进程ID
-F 格式化输出结果,用于其它命令。可以通过多种方式格式化,如-F pcfn(用于进程id、命令名、文件描述符、文件名,并以空终止)
-l 在输出显示用户ID而不是用户名
-U 获取UNIX套接口地址
输出介绍
【command】进程名称/命令
【pid】进程id
【tid】线程id
【user】进程所有者
【fd】文件描述符
cwd:表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录
txt:该类型的文件是程序代码,如应用程序二进制文件本身或共享库
lnn:library references (AIX)
er:FD information error (see NAME column)
jld:jail directory (FreeBSD)
ltx:shared library text (code and data)
mxx:hex memory-mapped type number xx
m86:DOS Merge mapped file
mem:memory-mapped file
mmap:memory-mapped device
pd:parent directory
rtd:root directory
tr:kernel trace file (OpenBSD)
v86:VP/ix mapped file
0:表示标准输出
1:表示标准输入
2:表示标准错误
【type】文件类型
DIR:表示目录
CHR:表示字符类型
BLK:块设备类型
UNIX:UNIX域套接字
FIFO:先进先出(FIFO)队列
IPv4:网际协议(IP)套接字
【device】磁盘名称
【size/off】文件大小
【node】索引节点(文件在磁盘上的标识)
【name】打开文件的确切名称
-
使用场景
【1】查看端口被哪个进程占用
lsof -i:端口
[root@localhost sbin]# lsof -i:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 1087 root 6u IPv4 21571 0t0 TCP *:http (LISTEN)
nginx 1088 nobody 6u IPv4 21571 0t0 TCP *:http (LISTEN)
[root@localhost sbin]# lsof -i :22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 912 root 3u IPv4 18920 0t0 TCP *:ssh (LISTEN)
sshd 912 root 4u IPv6 18929 0t0 TCP *:ssh (LISTEN)
sshd 1044 root 3u IPv4 20554 0t0 TCP localhost.localdomain:ssh->192.168.30.1:51424 (ESTABLISHED)
sshd 1048 root 3u IPv4 20616 0t0 TCP localhost.localdomain:ssh->192.168.30.1:51431 (ESTABLISHED)
【2】恢复被删除的文件
有时候 不小心删除了一个文件 lsof可以提供一个简单的恢复方法(前提是该文件被当前还在执行的进程打开)
例如lsof_test.txt文件我不小心rm -rf 删除掉了 数据比较重要 lsof命令就是一个简单的可能恢复的选择
这个时候 执行命令lsof |grep lsof_test.txt 发现另一个有人正在用less命令查看这个文件 并且可以看到最后位置的文件名称后面有个(deleted),说明这个文件已经被删除了,这个进程结束,文件就不能轻易恢复了,就需要更专业的操作
查出来的信息,可以得到进程id,文件描述符
这个时候我们就可以去 /proc/进程id/fd 下面找到这个文件了,如下面 这个4就是这个文件的副本(上面查到的文件描述符)
然后 cat 4 >> /root/lsof_test.txt 就可以将文件内容导出 重新生成文件了
【3】网络分析辅助:
列出所有的TCP网络连接信息:lsof -i tcp
列出80端口TCP协议的所有连接信息:lsof -i tcp:80
列出相关IP的连接信息(也可以加端口):lsof -i @172.0.0.1
(以上tcp也可换成udp)
【4】关于用户
列出指定用户打开的文件列表:lsof -u uasp -i tcp (可以看看某个用户都在干啥)
杀掉指定用户运行的所有东西:kill -9 'lsof -t -u xxuser'
【5】其他
列出指定进程(进程名)打开的文件:lsof -c nginx
列出指定进程打开的文件列表:lsof -p 20711
指定目录下(递归查询)被进程打开的文件列表:lsof +D /usr/local/
后记
lsof命令很强大 尤其是通过各种参数或者与其他linxu 命令组合 更显其强大