1、lsof 简介
lsof 是 linux 下的一个非常实用的系统级的监控、诊断工具。
它的意思是 List Open Files,很容易你就记住了它是 “ls + of”的组合~
它可以用来列出被各种进程打开的文件信息,记住:linux 下 “一切皆文件”,
包括但不限于 pipes, sockets, directories, devices, 等等。
因此,使用 lsof,你可以获取任何被打开文件的各种信息。
只需输入 lsof 就可以生成大量的信息,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。
2、lsof 常用用法
2.1 监控打开的文件、设备
查看文件、设备被哪些进程占用
列出被某个进程打开所有的网络文件:
或者
列出所有 tcp、udp 连接:
查看指定网口有哪些进程在使用:
3、更多使用技巧
3.1 监控用戶
查看指定用戶打开的文件(lsof -u ^lakshmanan 可以排除某用户):
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 是 linux 下的一个非常实用的系统级的监控、诊断工具。
它的意思是 List Open Files,很容易你就记住了它是 “ls + of”的组合~
它可以用来列出被各种进程打开的文件信息,记住:linux 下 “一切皆文件”,
包括但不限于 pipes, sockets, directories, devices, 等等。
因此,使用 lsof,你可以获取任何被打开文件的各种信息。
只需输入 lsof 就可以生成大量的信息,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。
lsof 的示例输出:
[root@CDNTest69 wm]# lsof | more
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root cwd DIR 8,1 4096 2 /
init 1 root rtd DIR 8,1 4096 2 /
init 1 root txt REG 8,1 150352 3804838 /sbin/init
init 1 root mem REG 8,1 65928 1048605 /lib64/libnss_files-2.12.so
init 1 root mem REG 8,1 1922152 1048653 /lib64/libc-2.12.so
init 1 root mem REG 8,1 93224 1048983 /lib64/libgcc_s-4.4.7-20120601.so.1
init 1 root mem REG 8,1 47064 1048613 /lib64/librt-2.12.so
init 1 root mem REG 8,1 145720 1048682 /lib64/libpthread-2.12.so
init 1 root mem REG 8,1 268232 1048618 /lib64/libdbus-1.so.3.4.0
init 1 root mem REG 8,1 39896 1048709 /lib64/libnih-dbus.so.1.0.0
init 1 root mem REG 8,1 101920 1048711 /lib64/libnih.so.1.0.0
init 1 root mem REG 8,1 156912 1048604 /lib64/ld-2.12.so
init 1 root 0u CHR 1,3 0t0 3656 /dev/null
init 1 root 1u CHR 1,3 0t0 3656 /dev/null
init 1 root 2u CHR 1,3 0t0 3656 /dev/null
init 1 root 3r FIFO 0,8 0t0 6679 pipe
init 1 root 4w FIFO 0,8 0t0 6679 pipe
2、lsof 常用用法
2.1 监控打开的文件、设备
查看文件、设备被哪些进程占用
[root@CDNTest69 wm]# lsof /dev/tty1
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mingetty 1491 root 0u CHR 4,1 0t0 5152 /dev/tty1
mingetty 1491 root 1u CHR 4,1 0t0 5152 /dev/tty1
mingetty 1491 root 2u CHR 4,1 0t0 5152 /dev/tty1
2.2 监控文件系统
指定目录、挂载点,可以看到有哪些进程打开了其下的文件:
[root@CDNTest69 wm]# lsof /home/wm/
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 2187 root cwd DIR 8,1 4096 5255364 /home/wm
vim 2215 root cwd DIR 8,1 4096 5255364 /home/wm
lsof 2238 root cwd DIR 8,1 4096 5255364 /home/wm
lsof 2239 root cwd DIR 8,1 4096 5255364 /home/wm
bash 31570 root cwd DIR 8,1 4096 5255364 /home/wm
2.3 监控进程
2.4 监控网络
查看指定端口有哪些进程在使用(lsof -i 列出所有的打开的网络连接):
[root@CDNTest69 wm]# lsof -i:22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1296 root 3u IPv4 9112 0t0 TCP *:ssh (LISTEN)
sshd 1296 root 4u IPv6 9114 0t0 TCP *:ssh (LISTEN)
sshd 2185 root 3r IPv4 3331745 0t0 TCP CDNTest69:ssh->172.31.11.74:ea (ESTABLISHED)
sshd 18642 root 3r IPv4 3120500 0t0 TCP CDNTest69:ssh->172.31.16.26:newlixengine (ESTABLISHED)
sshd 31568 root 3r IPv4 3309911 0t0 TCP CDNTest69:ssh->172.31.11.74:16980 (ESTABLISHED)
列出被某个进程打开所有的网络文件:
lsof -i -a -p 234
或者
lsof -i -a -c ssh
列出所有 tcp、udp 连接:
lsof -i tcp;
lsof -i udp;
列出所有 NFS 文件:
lsof -N -u lakshmanan -a
查看指定网口有哪些进程在使用:
[root@CDNTest69 wm]# lsof -i@192.168.8.69
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 2185 root 3r IPv4 3331745 0t0 TCP CDNTest69:ssh->172.31.11.74:ea (ESTABLISHED)
sshd 18642 root 3r IPv4 3120500 0t0 TCP CDNTest69:ssh->172.31.16.26:newlixengine (ESTABLISHED)
sshd 31568 root 3r IPv4 3309911 0t0 TCP CDNTest69:ssh->172.31.11.74:16980 (ESTABLISHED)
3、更多使用技巧
3.1 监控用戶
查看指定用戶打开的文件(lsof -u ^lakshmanan 可以排除某用户):
[root@CDNTest69 wm]# lsof -u root | more
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root cwd DIR 8,1 4096 2 /
init 1 root rtd DIR 8,1 4096 2 /
init 1 root txt REG 8,1 150352 3804838 /sbin/init
init 1 root mem REG 8,1 65928 1048605 /lib64/libnss_files-2.12.so
init 1 root mem REG 8,1 1922152 1048653 /lib64/libc-2.12.so
init 1 root mem REG 8,1 93224 1048983 /lib64/libgcc_s-4.4.7-20120601.so.1
init 1 root mem REG 8,1 47064 1048613 /lib64/librt-2.12.so
init 1 root mem REG 8,1 145720 1048682 /lib64/libpthread-2.12.so
init 1 root mem REG 8,1 268232 1048618 /lib64/libdbus-1.so.3.4.0
init 1 root mem REG 8,1 39896 1048709 /lib64/libnih-dbus.so.1.0.0
init 1 root mem REG 8,1 101920 1048711 /lib64/libnih.so.1.0.0
init 1 root mem REG 8,1 156912 1048604 /lib64/ld-2.12.so
3.2 监控应用程序
查看指定程序打开的文件:
[root@CDNTest69 wm]# lsof -c init
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root cwd DIR 8,1 4096 2 /
init 1 root rtd DIR 8,1 4096 2 /
init 1 root txt REG 8,1 150352 3804838 /sbin/init
init 1 root mem REG 8,1 65928 1048605 /lib64/libnss_files-2.12.so
init 1 root mem REG 8,1 1922152 1048653 /lib64/libc-2.12.so
init 1 root mem REG 8,1 93224 1048983 /lib64/libgcc_s-4.4.7-20120601.so.1
init 1 root mem REG 8,1 47064 1048613 /lib64/librt-2.12.so
init 1 root mem REG 8,1 145720 1048682 /lib64/libpthread-2.12.so
init 1 root mem REG 8,1 268232 1048618 /lib64/libdbus-1.so.3.4.0
init 1 root mem REG 8,1 39896 1048709 /lib64/libnih-dbus.so.1.0.0
init 1 root mem REG 8,1 101920 1048711 /lib64/libnih.so.1.0.0
init 1 root mem REG 8,1 156912 1048604 /lib64/ld-2.12.so
init 1 root 0u CHR 1,3 0t0 3656 /dev/null
init 1 root 1u CHR 1,3 0t0 3656 /dev/null
init 1 root 2u CHR 1,3 0t0 3656 /dev/null
init 1 root 3r FIFO 0,8 0t0 6679 pipe
init 1 root 4w FIFO 0,8 0t0 6679 pipe
init 1 root 5r DIR 0,10 0 1 inotify
init 1 root 6r DIR 0,10 0 1 inotify
init 1 root 7u unix 0xffff880037c17680 0t0 6680 socket
init 1 root 9u unix 0xffff88007d86c680 0t0 8688 socket
4、命令模式技巧
4.1 组合逻辑查询条件
只有多个查询条件都满足, 用 "-a" 参数,默认是 -o 。
[root@CDNTest69 wm]# lsof -a -c bash -u root
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 2187 root cwd DIR 8,1 4096 5255364 /home/wm
bash 2187 root rtd DIR 8,1 4096 2 /
bash 2187 root txt REG 8,1 938832 3014746 /bin/bash
bash 2187 root mem REG 8,1 156912 1048604 /lib64/ld-2.12.so
bash 2187 root mem REG 8,1 22536 1048988 /lib64/libdl-2.12.so
bash 2187 root mem REG 8,1 1922152 1048653 /lib64/libc-2.12.so
bash 2187 root mem REG 8,1 138280 1049003 /lib64/libtinfo.so.5.7
bash 2187 root mem REG 8,1 99158576 3419352 /usr/lib/locale/locale-archive
bash 2187 root mem REG 8,1 65928 1048605 /lib64/libnss_files-2.12.so
bash 2187 root mem REG 8,1 26060 3411690 /usr/lib64/gconv/gconv-modules.cache
4.2 lsof 命令的重复执行模式:
基于给定的参数延时多少秒重复执行 lsof
+r 表示 当没有文件被打开的时候,repeat mode 将自行结束。
-r 表示 不管文件是否存在或者被打开,它都将执行,直到你中断它。
每个循环的输出使用 ‘=======’ 做分隔符,你也可以用 ‘-r’ | ‘+r’ 指定延时时间。
[root@CDNTest69 wm]# lsof -u root -c init -a -r5
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root cwd DIR 8,1 4096 2 /
init 1 root rtd DIR 8,1 4096 2 /
init 1 root txt REG 8,1 150352 3804838 /sbin/init
init 1 root mem REG 8,1 65928 1048605 /lib64/libnss_files-2.12.so
init 1 root mem REG 8,1 1922152 1048653 /lib64/libc-2.12.so
init 1 root mem REG 8,1 93224 1048983 /lib64/libgcc_s-4.4.7-20120601.so.1
init 1 root mem REG 8,1 47064 1048613 /lib64/librt-2.12.so
init 1 root mem REG 8,1 145720 1048682 /lib64/libpthread-2.12.so
init 1 root mem REG 8,1 268232 1048618 /lib64/libdbus-1.so.3.4.0
init 1 root mem REG 8,1 39896 1048709 /lib64/libnih-dbus.so.1.0.0
init 1 root mem REG 8,1 101920 1048711 /lib64/libnih.so.1.0.0
init 1 root mem REG 8,1 156912 1048604 /lib64/ld-2.12.so
init 1 root 0u CHR 1,3 0t0 3656 /dev/null
init 1 root 1u CHR 1,3 0t0 3656 /dev/null
init 1 root 2u CHR 1,3 0t0 3656 /dev/null
init 1 root 3r FIFO 0,8 0t0 6679 pipe
init 1 root 4w FIFO 0,8 0t0 6679 pipe
init 1 root 5r DIR 0,10 0 1 inotify
init 1 root 6r DIR 0,10 0 1 inotify
init 1 root 7u unix 0xffff880037c17680 0t0 6680 socket
init 1 root 9u unix 0xffff88007d86c680 0t0 8688 socket
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/
实用的系统工具之 lsof
http://www.ylinux.org/forum/t/276