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  
3 COMMAND  
PID   USER  FD   TYPE DEVICE SIZE/OFF   NODE NAME
4 rsyslogd 
488 syslog   1w   REG    8,1     1151 268940 /var/log/syslog
5 rsyslogd 
488 syslog   2w   REG    8,1     2405 269616 /var/log/auth.log
6 console-k
144   root   9w   REG    8,1    10871 269369 /var/log/ConsoleKit/
history

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

01 #
lsof -c ssh -c init
02  
03 COMMAND   
PID   USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
04 init        
1       root  txt    REG        8,1   124704  917562 /sbin/init
05 init        
1       root  mem    REG        8,1  1434180 1442625 /lib/i386-linux-gnu/libc-2.13.so
06 init        
1       root  mem    REG        8,1    30684 1442694 /lib/i386-linux-gnu/librt-2.13.so
07 ...
08 ssh-agent
1528 lakshmanan    1u   CHR        1,3      0t0    4369 /dev/null
09 ssh-agent
1528 lakshmanan    2u   CHR        1,3      0t0    4369 /dev/null
10 ssh-agent
1528 lakshmanan    3u  unix 0xdf70e240      0t0   10464 /tmp/
ssh-sUymKXxw1495/agent.1495

2.3 监控进程

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

01 #
lsof -p 2064
02 COMMAND 
PID USER   FD   TYPE     DEVICE SIZE/OFF    NODE NAME
03 firefox
2064 jian  cwd    DIR        8,6     4096 1571780 /home/jian
04 firefox
2064 jian  rtd    DIR        8,6     4096       2 /
05 firefox
2064 jian  txt    REG        8,6    44224 1985670 /usr/lib/firefox-12.0/firefox
06 firefox
2064 jian  mem    REG        8,6 14707012  925361 /usr/share/fonts/chinese/msyhbd.ttf
07 firefox
2064 jian  mem    REG        8,6 15067744  925362 /usr/share/fonts/chinese/msyh.ttf
08 firefox
2064 jian  mem    REG        8,6 16791251 1701681 /usr/share/fonts/wenquanyi/wqy-zenhei.ttc
09 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
   

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’ 指定延时时间。

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

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

5、最后的技巧

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

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

lsof|grep -i delete

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

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

此时你可以:

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

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

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/

原文地址:http://www.ylinux.org/forum/t/27

linux 系统监控、诊断工具之 lsof 用法简介的更多相关文章

  1. Linux 系统监控.诊断工具之 IO wait

    1. 常用组合方式有如下几种: 用vmstat.sar.iostat检测是否是CPU瓶颈 用free.vmstat检测是否是内存瓶颈 用iostat.dmesg 检测是否是磁盘I/O瓶颈 用netst ...

  2. linux系统监控常用工具

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

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

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

  4. Linux系统中nc工具那些不为人知的用法

    Linux nc命令用法 参考地址:https://www.cnblogs.com/jjzd/p/6306273.html -g<网关>:设置路由器跃程通信网关,最多设置8个; -G< ...

  5. 一张图记住Linux系统常用诊断工具

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

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

  7. Linux记录-linux系统监控命令汇总

    命令 功能应用 用法举例     free 查看内存使用情况,包括物理内存和虚拟内存 free -h或free -m     vmstat 对系统的整体情况进行统计,包括内核进程.虚拟内存.磁盘.陷阱 ...

  8. [转帖]linux lsof 用法简介

    linux lsof 用法简介 https://www.cnblogs.com/saneri/p/5333333.html 1.简介: lsof(list open files)是一个列出当前系统打开 ...

  9. Linux系统IO分析工具之iotop常用参数介绍

      Linux系统IO分析工具之iotop常用参数介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在一般运维工作中经常会遇到这么一个场景,服务器的IO负载很高(iostat中的 ...

随机推荐

  1. Redis持久化AOF和RDB对比

    RDB持久化 AOF持久化 全量备份,一次保存整个数据库 增量备份,一次保存一个修改数据库的命令 保存的间隔较长 保存的间隔默认一秒 数据还原速度快 数据还原速度一般 save会阻塞,但bgsave或 ...

  2. 嵌入式Servlet容器自动配置和启动原理

    EmbeddedServletContainerAutoConfiguration:嵌入式的Servlet容器自动配置? @AutoConfigureOrder(Ordered.HIGHEST_PRE ...

  3. java8新特性(二)_lambda表达式

    最近一直找java8相关新特性的文章,发现都太没有一个连贯性,毕竟大家写博客肯定都有自己的侧重点,这里找到一本书,专门介绍java8新特性的,感觉大家可以看看<写给大忙人看的JavaSE8> ...

  4. LeetCode--429--N叉树的层序遍历

    问题描述: 给定一个N叉树,返回其节点值的层序遍历. (即从左到右,逐层遍历). 例如,给定一个 3叉树 : 返回其层序遍历: [ [1], [3,2,4], [5,6] ] 说明: 树的深度不会超过 ...

  5. python基础之 025 模块加载与import的使用

    内容梗概: 1. 模块 2. import 3. from xxx import xxx 1.模块定义:模块就是一个包含了python定义和声明的文件,文件名就是模块的名字加上.py后缀.目前写的所有 ...

  6. Leetcode 868. 二进制间距

    868. 二进制间距  显示英文描述 我的提交返回竞赛   用户通过次数201 用户尝试次数220 通过次数207 提交次数396 题目难度Easy 给定一个正整数 N,找到并返回 N 的二进制表示中 ...

  7. centos7安装nginx 报./configure: error: C compiler cc is not found

    CentOS 7 下 安装 nginx 执行配置命令 ./configure 时提示以下错误: 解决: 执行以下命令: yum -y install gcc gcc-c++ autoconf auto ...

  8. MySQL中的文件

    查看数据目录: select @@datadir; 共享表空间: ibdata1 Redo log file:ib_logfile0, ib_logfile1 二进制日志:需要配置参数 server- ...

  9. Qt Widgets——工具栏和状态栏

    本文主要涉及QSizeGrip ,QStatusBar ,QToolBar QToolBar 工具栏默认位于菜单栏下方,其上添加一个个action按钮,用于执行动作 绝大多谢以前都涉及过,只列出 QT ...

  10. Java Code Examples for org.codehaus.jackson.map.DeserializationConfig 配置

    The following code examples are extracted from open source projects. You can click  to vote up the e ...