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:显示版本信息。

实例

例1、lsof 不带任何参数运行lsof会列出所有进程打开的所有文件。

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

COMMAND:进程的名称
PID:进程标识符
PPID:父进程标识符(需要指定-R参数)
USER:进程所有者
PGID:进程所属组
FD:文件描述符,应用程序通过文件描述符识别该文件。

文件描述符列表:

cwd:表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改
txt:该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序
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:表示标准错误

一般在标准输出、标准错误、标准输入后还跟着文件状态模式:

u:表示该文件被打开并处于读取/写入模式。
r:表示该文件被打开并处于只读模式。
w:表示该文件被打开并处于。
空格:表示该文件的状态模式为unknow,且没有锁定。
-:表示该文件的状态模式为unknow,且被锁定。

同时在文件状态模式后面,还跟着相关的锁:
N:for a Solaris NFS lock of unknown type;
r:for read lock on part of the file;
R:for a read lock on the entire file;
w:for a write lock on part of the file;(文件的部分写锁)
W:for a write lock on the entire file;(整个文件的写锁)
u:for a read and write lock of any length;
U:for a lock of unknown type;
x:for an SCO OpenServer Xenix lock on part of the file;
X:for an SCO OpenServer Xenix lock on the entire file;
space:if there is no lock.

文件类型:

DIR:表示目录。
CHR:表示字符类型。
BLK:块设备类型。
UNIX: UNIX 域套接字。
FIFO:先进先出 (FIFO) 队列。
IPv4:网际协议 (IP) 套接字。
DEVICE:指定磁盘的名称
SIZE:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称

常用总结


1. 找出谁在使用某个文件

 # lsof /path/to/file

只需要执行文件的路径,lsof就会列出所有使用这个文件的进程,你也可以列出多个文件,lsof会列出所有使用这些文件的进程。

你也可以一次制定多个文件:

 # lsof /path/to/file1 /path/to/file2

2. 递归查找某个目录中所有打开的文件

 # lsof +D /usr/bin

加上+D参数,lsof会对指定目录进行递归查找,注意这个参数要比grep版本慢

 # lsof | grep ‘/usr/lib’

之所以慢是因为+D首先查找所有的文件,然后一次性输出。


3.列出某个用户打开的所有文件

 # lsof -u pkrumins

-u选项限定只列出所有被用户pkrumins打开的文件,你可以通过逗号指定多个用户:

 # lsof -u rms,root

这条命令会列出所有rms和root用户打开的文件。

你也可以像下面这样使用多个-u做同样的事情:

 # lsof -u rms -u root

4.查找某个程序打开的所有文件

 # lsof -c apache


-c选项限定只列出以apache开头的进程打开的文件:

所以你可以不用像下面这样写:

 # lsof | grep foo

而使用下面这个更简短的版本:

 # lsof -c foo

事实上,你可以只制定进程名称的开头:

 # lsof -c apa

这会列出所有以apa开头的进程打开的文件

你同样可以制定多个-c参数:

 # lsof -c apache -c python

这会列出所有由apache和python打开的文件


5.列出所有由某个用户某个进程打开的文件(组合)

# lsof -u pkrumins -c apache

你也可以组合使用多个选项,这些选项默认进行或关联,也就是说上面的命令会输入由pkrumins用户或是apache进程打开的文件。

列出所有由一个用户-a选项表示 某个进程打开的文件

# lsof -a -u pkrumins -c bash

-a参数可以将多个选项的组合条件由或变为与,上面的命令会显示所有由pkrumins用户以及bash进程打开的文件。

列出除root用户外的所有用户打开的文件

# lsof -u ^root

注意root前面的^符号,它执行取反操作,因此lsof会列出所有root用户之外的用户打开的文件。


6.列出所有由某个PID对应的进程打开的文件

 # lsof -p 1

-p选项让你可以使用进程id来过滤输出。

记住你也可以用都好来分离多个pid

 # lsof -p 450,980,333

列出所有进程打开的文件除了某个pid的

 # lsof -p ^1

同前面的用户一样,你也可以对-p选项使用^来进行取反。


7.列出所有网络连接

 # lsof -i


lsof的-i选项可以列出所有打开了网络套接字(TCP和UDP)的进程。

列出所有TCP网络连接

 # lsof -i tcp

也可以为-i选项加上参数,比如tcp,tcp选项会强制lsof只列出打开TCP sockets的进程。

列出所有UDP网络连接

 # lsof -i udp

同样udp让lsof只列出使用UDP socket的进程。

找到使用某个端口的进程

 # lsof -i :25

:25和-i选项组合可以让lsof列出占用TCP或UDP的25端口的进程。

你也可以使用/etc/services中制定的端口名称来代替端口号,比如:

 # lsof -i :smtp

找到使用某个udp端口号的进程

 # lsof -i udp:53

同样的,也可以找到使用某个tcp端口的进程:

 # lsof -i tcp:80

也可以查找ipv4 ipv6链接的进程

 # lsof -i 4


8.找到某个用户的所有网络连接

 # lsof -a -u hacker -i

使用-a将-u和-i选项组合可以让lsof列出某个用户的所有网络行为。

9.列出所有NFS(网络文件系统)文件

 # lsof -N

这个参数很好记,-N就对应NFS。

10.列出所有UNIX域Socket文件

 # lsof -U

这个选项也很好记,-U就对应UNIX。

11.列出所有对应某个组id的进程

 # lsof -g 1234

进程组用来来逻辑上对进程进行分组,这个例子查找所有PGID为1234的进程打开的文件。

列出所有与某个描述符关联的文件

# lsof -d 2

这个命令会列出所有以描述符2打开的文件。

你也可以为描述符指定一个范围

# lsof -d 0-2

这会列出所有描述符为0,1,2的文件。

-d选项还支持其它很多特殊值,下面的命令列出所有内存映射文件:

# lsof -d mem

txt则列出所有加载在内存中并正在执行的进程

# lsof -d txt

输出使用某些资源的进程pid

# lsof -t -i

-t选项输出进程的PID,你可以将它和-i选项组合输出使用某个端口的进程的PID,下面的命令将会杀掉所有使用网络的进程:

# kill -9 `lsof -t -i`

循环列出文件

# lsof -r 1

-r选项让lsof可以循环列出文件直到被中断,参数1的意思是每秒钟重复打印一次,这个选项最好同某个范围比较小的查询组合使用,比如用来监测网络活动:

# lsof -r 1 -u john -i -a

最后你可以通过man lsof来了解关于lsof的完整文档,或者通过lsof -h查看。

参考:
http://www.cnblogs.com/wangkangluo1/archive/2012/04/18/2454916.html

2017年3月21日

lsof 命令用法详解的更多相关文章

  1. systemctl命令用法详解

    systemctl命令用法详解系统环境:Fedora 16binpath:/bin/systemctlpackage:systemd-units systemctl enable httpd.serv ...

  2. Ubuntu kill命令用法详解

    转自:Ubuntu kill命令用法详解 1. kill   作用:根据进程号杀死进程   用法: kill [信号代码] 进程ID   root@fcola:/# ps -ef | grep sen ...

  3. install 命令用法详解

    install 命令用法详解 http://man.linuxde.net/install install命令的作用是安装或升级软件或备份数据,它的使用权限是所有用户.install命令和cp命令类似 ...

  4. Linux下find命令用法详解

    Linux下find命令用法详解   学神VIP烟火 学神IT教育:XueGod-IT   最负责任的线上直播教育平台   本文作者为VIP学员 烟火   第一部分:根据文件名查找   1.在当前目录 ...

  5. Linux Shell脚本入门--wget 命令用法详解

    Linux Shell脚本入门--wget 命令用法详解 wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括Windows在内的各个平台上.它有以下功能 ...

  6. (转)linux paste命令用法详解

    linux paste命令用法详解原文:http://www.xfcodes.com/linuxcmd/mulu/10211.htmlinux下paste命令,可用于合并文件的列. 功能说明:合并文件 ...

  7. CentOS 7.X 中systemctl命令用法详解

    systemctl是RHEL 7 的服务管理工具中主要的工具,它融合之前service和chkconfig的功能于一体.可以使用它永久性或只在当前会话中启用/禁用服务,下面来看CentOS 7.X 中 ...

  8. [转帖]强大的strace命令用法详解

    强大的strace命令用法详解 文章转自: https://www.linuxidc.com/Linux/2018-01/150654.htm strace是什么? 按照strace官网的描述, st ...

  9. Mysql导入导出工具Mysqldump和Source命令用法详解

    Mysql本身提供了命令行导出工具Mysqldump和Mysql Source导入命令进行SQL数据导入导出工作,通过Mysql命令行导出工具Mysqldump命令能够将Mysql数据导出为文本格式( ...

随机推荐

  1. bootstrap table 分页序号递增问题 (转)

    原文地址:https://segmentfault.com/q/1010000011040346 如题,怎么在bootstrap table中显示序号,序号递增,并且分页有效,等于是每页10条,第2页 ...

  2. ModelBiner不验证某个属性

    问题 使用MVC的同学十有八九都会遇到这个错误:从客户端(Content="<script>...")中检测到有潜在危险的Request.Form 值. 这个错误是在请 ...

  3. Kotlin 接口

    Kotlin 接口与 Java 8 类似,使用 interface 关键字定义接口,允许方法有默认实现: interface MyInterface { fun bar() // 未实现 fun fo ...

  4. week 10--了解原型设计的工具

    了解原型设计的工具 随着原型应用的普及,越来越多的产品会采用原型设计来表述.完善整体需求,这样做自然有其原因.首先原型的制作成本和演示成本都比较低,除非比较复杂或者保真度要求比较高的原型,在描述一个功 ...

  5. LineRenderer实现一个画线组件

    using System; using UnityEngine; class UILine { GameObject targetObj; LineRenderer lineRenderer; //L ...

  6. primer3批量设计引物

    核心程序调用 Primer3_core,基本用法: primer3_core [ -format_output ] [ -default_version=1|-default_version=2 ] ...

  7. CycleGan论文笔记

    原文地址:https://arxiv.org/abs/1703.10593 背景——风格迁移 图片生成领域是GAN网络的天下,最近很多人将GAN网络应用到了图像风格迁移领域.这篇论文也是做image ...

  8. nmap工具简介

    nmap参数介绍: -sL:简单列表扫描 -sn:扫描主机,但是不进行端口扫描 -sS:TCP SYN扫描[半开放扫描,扫描速度高且隐蔽性好] -p |-F:扫描端口列表与扫描次序,常用的扫描方式[- ...

  9. java中的多线程入门

    进程:一个进程包括由操作系统分配的内存空间,包含一个或多个线程.一个线程不能独立的存在,它必须是进程的一部分.一个进程一直运行,直到所有的非守护线程都结束运行后才能结束. 而多线程的好处就是效率高,充 ...

  10. Java中Object类的方法笔记

    今天看了下Object类的源码,以下是我看源码的一些笔记,欢迎有小伙伴来补充~ 首先列举下几个主要方法(面试被问到过的): equals:这个主要是用于比较对象的,Object中比较的是比较原始的,直 ...