1、lsof 简介

lsof 是 Linux 下的一个非常实用的系统级的监控、诊断工具。

它的意思是 List Open Files,很容易你就记住了它是 “ls + of”的组合~

它可以用来列出被各种进程打开的文件信息,记住:Linux 下 “一切皆文件”,

包括但不限于 pipes, sockets, directories, devices, 等等。

因此,使用 lsof,你可以获取任何被打开文件的各种信息。

只需输入 lsof 就可以生成大量的信息,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。

lsof 的示例输出:

  1. root@YLinux:~/lab 0# lsof
  2. COMMAND     PID   TID       USER   FD      TYPE     DEVICE SIZE/OFF       NODE NAME
  3. systemd       1       root  cwd       DIR        8,6     4096          2 /
  4. systemd       1       root  rtd       DIR        8,6     4096          2 /
  5. systemd       1       root  txt       REG        8,6  2273340    1834909 /usr/lib/systemd/systemd
  6. systemd       1       root  mem       REG        8,6   210473    1700647 /lib/libnss_files-2.15.s
  7. ...

2、lsof 常用用法

2.1 监控打开的文件、设备

查看文件、设备被哪些进程占用:

  1. # lsof /dev/tty1
  2. COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
  3. bash       1770 jian    0u   CHR    4,1      0t0 1045 /dev/tty1
  4. bash       1770 jian    1u   CHR    4,1      0t0 1045 /dev/tty1
  5. bash       1770 jian    2u   CHR    4,1      0t0 1045 /dev/tty1
  6. bash       1770 jian  255u   CHR    4,1      0t0 1045 /dev/tty1
  7. startx     1845 jian    0u   CHR    4,1      0t0 1045 /dev/tty1
  8. startx     1845 jian    1u   CHR    4,1      0t0 1045 /dev/tty1
  9. ...

2.2 监控文件系统

指定目录、挂载点,可以看到有哪些进程打开了其下的文件:

  1. # lsof /data/
  2. COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
  3. bash    15983 jian  cwd    DIR    8,5     4096 8252 /data/backup
  4. ...

这在 umount 某个文件系统失败时非常有用(通常会报该 FS is busy)。

列出某个目录(挂载点 如 /home 也行)下被打开的文件:

  1. # lsof +D /var/log/
  2. COMMAND   PID   USER  FD   TYPE DEVICE SIZE/OFF   NODE NAME
  3. rsyslogd  488 syslog   1w   REG    8,1     1151 268940 /var/log/syslog
  4. rsyslogd  488 syslog   2w   REG    8,1     2405 269616 /var/log/auth.log
  5. console-k 144   root   9w   REG    8,1    10871 269369 /var/log/ConsoleKit/history

列出被指定进程名打开的文件:

  1. # lsof -c ssh -c init
  2. COMMAND    PID   USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
  3. init       1       root  txt    REG        8,1   124704  917562 /sbin/init
  4. init       1       root  mem    REG        8,1  1434180 1442625 /lib/i386-Linux-gnu/libc-2.13.so
  5. init       1       root  mem    REG        8,1    30684 1442694 /lib/i386-Linux-gnu/librt-2.13.so
  6. ...
  7. ssh-agent 1528 lakshmanan    1u   CHR        1,3      0t0    4369 /dev/null
  8. ssh-agent 1528 lakshmanan    2u   CHR        1,3      0t0    4369 /dev/null
  9. ssh-agent 1528 lakshmanan    3u  unix 0xdf70e240      0t0   10464 /tmp/ssh-sUymKXxw1495/agent.1495

2.3 监控进程

指定进程号,可以查看该进程打开的文件:

  1. # lsof -p 2064
  2. COMMAND  PID USER   FD   TYPE     DEVICE SIZE/OFF    NODE NAME
  3. firefox 2064 jian  cwd    DIR        8,6     4096 1571780 /home/jian
  4. firefox 2064 jian  rtd    DIR        8,6     4096       2 /
  5. firefox 2064 jian  txt    REG        8,6    44224 1985670 /usr/lib/firefox-12.0/firefox
  6. firefox 2064 jian  mem    REG        8,6 14707012  925361 /usr/share/fonts/chinese/msyhbd.ttf
  7. firefox 2064 jian  mem    REG        8,6 15067744  925362 /usr/share/fonts/chinese/msyh.ttf
  8. firefox 2064 jian  mem    REG        8,6 16791251 1701681 /usr/share/fonts/wenquanyi/wqy-zenhei.ttc
  9. firefox 2064 jian  mem    REG       0,16 67108904   10203 /dev/shm/pulse-shm-3021850167
  10. ...

当你想要杀掉某个用户所有打开的文件、设备,你可以这样:

  1. kill -9 `lsof -t -u lakshmanan`

此处 -t 的作用是单独的列出 进程 id 这一列。

关于杀死进程的 4 种方式,请参考:

http://www.thegeekstuff.com/2009/12/4-ways-to-kill-a-process-kill-killall-pkill-xkill/

2.4 监控网络

查看指定端口有哪些进程在使用(lsof -i 列出所有的打开的网络连接):

  1. # lsof -i:22
  2. COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
  3. sshd    1569 root    3u  IPv4  10303      0t0  TCP *:ssh (LISTEN)
  4. sshd    1569 root    4u  IPv6  10305      0t0  TCP *:ssh (LISTEN)
  5. ...

列出被某个进程打开所有的网络文件:

  1. lsof -i -a -p 234

或者:

  1. lsof -i -a -c ssh

列出所有 tcp、udp 连接:

  1. lsof -i tcp;
  2. lsof -i udp;

列出所有 NFS 文件:

  1. lsof -N -u lakshmanan -a

查看指定网口有哪些进程在使用:

  1. # lsof -i@192.168.1.91
  2. COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
  3. skype      1909 jian   54u  IPv4   9116      0t0  TCP 192.168.1.91:40640->64.4.23.153:40047 (ESTABLISHED)
  4. pidgin     1973 jian    7u  IPv4   6599      0t0  TCP 192.168.1.91:59311->hx-in-f125.1e100.net:https (ESTABLISHED)
  5. pidgin     1973 jian   13u  IPv4   9260      0t0  TCP 192.168.1.91:54447->by2msg3010511.phx.gbl:msnp (ESTABLISHED)
  6. ...

3、更多使用技巧

3.1 监控用戶

查看指定用戶打开的文件(lsof -u ^lakshmanan 可以排除某用户):

  1. # lsof -u messagebus
  2. COMMAND    PID       USER   FD   TYPE     DEVICE SIZE/OFF    NODE NAME
  3. dbus-daem 1805 messagebus  cwd    DIR        8,6     4096       2 /
  4. dbus-daem 1805 messagebus  rtd    DIR        8,6     4096       2 /
  5. dbus-daem 1805 messagebus  txt    REG        8,6  1235361 1834948 /usr/bin/dbus-daemon
  6. dbus-daem 1805 messagebus  mem    REG        8,6   210473 1700647 /lib/libnss_files-2.15.so
  7. dbus-daem 1805 messagebus  mem    REG        8,6   190145 1700642 /lib/libnss_nis-2.15.so
  8. dbus-daem 1805 messagebus  mem    REG        8,6   490366 1700636 /lib/libnsl-2.15.so
  9. ...

3.2 监控应用程序

查看指定程序打开的文件:

  1. # lsof -c firefox
  2. COMMAND  PID USER   FD   TYPE     DEVICE SIZE/OFF    NODE NAME
  3. firefox 2064 jian  cwd    DIR        8,6     4096 1571780 /home/jian
  4. firefox 2064 jian  rtd    DIR        8,6     4096       2 /
  5. firefox 2064 jian  txt    REG        8,6    44224 1985670 /usr/lib/firefox-12.0/firefox
  6. firefox 2064 jian  mem    REG        8,6 14707012  925361 /usr/share/fonts/chinese/msyhbd.ttf
  7. firefox 2064 jian  mem    REG        8,6 15067744  925362 /usr/share/fonts/chinese/msyh.ttf
  8. firefox 2064 jian  mem    REG        8,6 16791251 1701681 /usr/share/fonts/wenquanyi/wqy-zenhei.ttc
  9. ...

4、命令模式技巧

4.1 组合逻辑查询条件

只有多个查询条件都满足, 用 "-a" 参数,默认是 -o 。

  1. # lsof -a -c bash -u root
  2. COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
  3. bash    1986 root  cwd    DIR    8,6     4096 1701593 /root/lab
  4. bash    1986 root  rtd    DIR    8,6     4096       2 /
  5. bash    1986 root  txt    REG    8,6  1994157 1700632 /bin/bash
  6. bash    1986 root  mem    REG    8,6  9690800  405214 /usr/lib/locale/locale-archive
  7. bash    1986 root  mem    REG    8,6   210473 1700647 /lib/libnss_files-2.15.so

4.2 lsof 命令的重复执行模式:

基于给定的参数延时多少秒重复执行 lsof:

  • +r 表示 当没有文件被打开的时候,repeat mode 将自行结束。
  • -r 表示 不管文件是否存在或者被打开,它都将执行,直到你中断它。

每个循环的输出使用 ‘=======’ 做分隔符,你也可以用 ‘-r’ | ‘+r’ 指定延时时间。

  1. # lsof -u lakshmanan -c init -a -r5
  2. =======
  3. =======
  4. COMMAND   PID       USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
  5. inita.sh 2971 lakshmanan  cwd    DIR    8,1     4096  393218 /home/lakshmanan
  6. inita.sh 2971 lakshmanan  rtd    DIR    8,1     4096       2 /
  7. inita.sh 2971 lakshmanan  txt    REG    8,1    83848  524315 /bin/dash
  8. inita.sh 2971 lakshmanan  mem    REG    8,1  1434180 1442625 /lib/i386-Linux-gnu/libc-2.13.so
  9. inita.sh 2971 lakshmanan  mem    REG    8,1   117960 1442612 /lib/i386-Linux-gnu/ld-2.13.so
  10. inita.sh 2971 lakshmanan    0u   CHR  136,4      0t0       7 /dev/pts/4
  11. inita.sh 2971 lakshmanan    1u   CHR  136,4      0t0       7 /dev/pts/4
  12. inita.sh 2971 lakshmanan    2u   CHR  136,4      0t0       7 /dev/pts/4
  13. inita.sh 2971 lakshmanan   10r   REG    8,1       20  393578 /home/lakshmanan/inita.sh
  14. =======

以上输出是前 5 秒没有输出,然后 “inita.sh” 启动后,开始有了输出。

5、最后的技巧

关于磁盘空间告警 df -h --max=1 与 du -hx --max=1 显示不一致的问题,

最常见的的还是下面这种情况:

  1. lsof|grep -i delete

看看被删除的文件:有些删了文件,但是进程没 reload,那些空间还是占用的,你可以理解为类似 windows 下的进程句柄没释放的概念吧~ 只是 windows 下如果有文件被进程使用,你一般是删不掉的,而 Linux 虽然不做删除限制,但却要等到进程使用完文件才能完全释放,以防止进程奔溃,这是操作系统对资源的管理差异吧~

例如 nginx 会有很多临时文件占用了 /tmp 目录,删掉后,依然占用着空间,

此时你可以:

  1. pkill -9 nginx && /etc/init.d/nginx restart

好吧,本文到此结束了,关于 lsof 还有很多很多,不过哥常用、知道的就这些了,哥也只能帮你到这儿了,

如果你还需要其它的内容,请自行 google 吧,骚年。。。

6、refer: 

使用 lsof 查找打开的文件:

http://www.ibm.com/developerworks/cn/aix/library/au-lsof.html

15 Linux lsof Command Examples (Identify Open Files):

http://www.thegeekstuff.com/2012/08/lsof-command-examples/

实用的系统工具之 lsof:

http://www.yLinux.org/forum/t/276

Linux 系统监控和诊断工具:lsof的更多相关文章

  1. [转]linux 系统监控、诊断工具之 IO wait

    1.问题: 最近在做日志的实时同步,上线之前是做过单份线上日志压力测试的,消息队列和客户端.本机都没问题,但是没想到上了第二份日志之后,问题来了: 集群中的某台机器 top 看到负载巨高,集群中的机器 ...

  2. linux 系统监控、诊断工具之 lsof 用法简介

    1.lsof 简介 lsof 是 Linux 下的一个非常实用的系统级的监控.诊断工具. 它的意思是 List Open Files,很容易你就记住了它是 "ls + of"的组合 ...

  3. (转)Linux 系统监控、诊断工具之 top命令详解

    原文:https://www.linuxidc.com/Linux/2014-12/110563.htm 目录 (1)系统.任务统计信息:(2)进程. cpu 统计信息:(3)最后两行为内存信息:3. ...

  4. 系统监控、诊断工具之top

    大家对top 命令可能不会陌生,它的作用主要用来监控系统实时负载率.进程的资源占用率及其它各项系统状态属性是否正常. top命令的截图如下: (1)系统.任务统计信息: 前8行是系统整体的统计信息.第 ...

  5. linux系统监控常用工具

    linux系统监控常用工具 一.系统核心工具包(coreutils) 1./bin/df 报告系统的磁盘空间用量 df -h  显示磁盘分区fdisk -l 2./bin/uname 显示系统信息 u ...

  6. Linux系统监控实用工具Glances

    Linux系统监控实用工具Glances Glances安装 Glances安装要求:python >= 2.6 和 psutil >= 0.4.1 1.第一步,安装了python-> ...

  7. <JVM下篇:性能监控与调优篇>03-JVM监控及诊断工具-GUI篇

    笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...

  8. <JVM下篇:性能监控与调优篇>01-概述篇-02-JVM监控及诊断工具-命令行篇

    笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...

  9. linux系统监控sar命令

    linux系统监控sar命令详解 sar(System Activity Reporter系统活动情况报告)是目前 Linux 上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告, 包 ...

随机推荐

  1. [HDOJ4578]Transformation(线段树,多延迟标记)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4578 四种操作:查询.加法.乘法.改数.应该是需要维护三个lazy标记,然后就是套路了.查询是区间内所 ...

  2. 配置hibernate根据实体类自动建表功能

    Hibernate支持自动建表,在开发阶段很方便,可以保证hbm与数据库表结构的自动同步. 如何使用呢?很简单,只要在hibernate.cfg.xml里加上如下代码 Xml代码<propert ...

  3. linux文件和目录基本操作

    比较特殊的目录: .   代表此层目录 .. 代表上一层目录 - 代表前一个工作目录 -代表当前用户身份所在的主文件夹 -account 代表account用户所在主文件夹 1.目录相关操作 cd切换 ...

  4. uva11181Probability|Given

    枚举,条件概率. 2^20次方等于100w,是大约可以没准还能过的. 二进制枚举时,如果买东西的人恰好为r个,设概率为p,就将sum[i]+=p(sum[i]为r个人买东西时第i个人买东西的概率),t ...

  5. 亲测!Jquery2.0不支持IE8-了

    最近由于测试需要,Win7回退到了官方更新的IE8浏览器,惊人的发现: <script src="//cdn.bootcss.com/jquery/2.0.0/jquery.min.j ...

  6. UVa 11330 (置换 循环的分解) Andy's Shoes

    和UVa11077的分析很类似. 我们固定左脚的鞋子不动,然后将右脚的鞋子看做一个置换分解. 对于一个长度为l的循环节,要交换到正确位置至少要交换l-1次. #include <cstdio&g ...

  7. CodeForces Round #279 (Div.2)

    A: 题意: 有三个项目和n个学生,每个学生都擅长其中一个项目,现在要组成三个人的队伍,其中每个人恰好擅长其中一门,问能组成多少支队伍. 分析: 最多能组成的队伍的个数就是擅长项目里的最少学生. #i ...

  8. UITableViewCell上的按钮点击事件处理

    转自:  http://www.aichengxu.com/view/42871 UITableViewCell上的按钮点击事件处理,有需要的朋友可以参考下. 今天突然做项目的时候,又遇到处理自定义的 ...

  9. 脚本AI与脚本引擎

    Scripted AI and Scripting Engines 脚本AI与脚本引擎 This chapter discusses some of the techniques you can us ...

  10. POJ 2942 Knights of the Round Table (点双连通分量)

    题意:多个骑士要开会,3人及以上才能凑一桌,其中部分人已经互相讨厌,肯定不坐在同一桌的相邻位置,而且一桌只能奇数个人才能开台.给出多个人的互相讨厌图,要求多少人开不成会(注:会议不要求同时进行,一个人 ...