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

最新文章

  1. 泛型的排序问题(Collections.sort及Comparable的应用)
  2. PHP 数组函数整理
  3. Powerdesigner 16.5 从SQL Server 2012做逆向工程时提示:Unable to list tables问题
  4. ios 编码转换 保存文件
  5. libevent入门教程
  6. selenium-webdriver的等待方法
  7. 关于twitter的GIF变mp4的测试
  8. SQL Server Primary key 、clustered index 、 unique
  9. LayoutInflater作用是将layout的xml布局文件实例化为View类对象。
  10. Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity
  11. 利用qq设置个性化的域名邮箱
  12. Myeclipse 10安装与破解
  13. 项目构建工具Maven
  14. Android GL deadlock timeout error
  15. 好程序员技术教程分享JavaScript运动框架
  16. HTML5商城开发五 实现返回页面顶部
  17. spring boot vuejs
  18. python之路——19
  19. Oracle 修改表 Alter Table...
  20. Literal 字面值 字面量 的理解

热门文章

  1. zlib用法说明
  2. bzoj3551 3545
  3. HDU 5285 wyh2000 and pupil (二分图着色)
  4. Storm入门教程 第二章 构建Topology[转]
  5. Period(KMP,循环节问题)
  6. CodeForces 558E(计数排序+线段树优化)
  7. Oracle中表结构和表内容复制
  8. javascript AES加密 C#AES解密实现
  9. C++ 编程输入输出语句
  10. ARM指令集----杂项指令