lsof 命令
特别注意
- 同时使用多个选项时, 默认行为是对结果进行**“逻辑或”运算**
- 使用选项
-a
则为逻辑与
=
1 默认行为
没有选项,则列出活跃进程的所有打开文件
=
2 查看所有网络连接
[root@jacklee ~]# lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ntpd 590 ntp 16u IPv4 18521 0t0 UDP VM-4-5-centos:ntp
ntpd 590 ntp 17u IPv6 18522 0t0 UDP VM-4-5-centos:ntp
ntpd 590 ntp 19u IPv4 25052 0t0 UDP jacklee.cc:ntp
ntpd 590 ntp 20u IPv6 25053 0t0 UDP jacklee.cc:ntp
dhclient 973 root 6u IPv4 20054 0t0 UDP *:bootpc
sshd 1183 root 3u IPv4 24358 0t0 TCP *:ssh (LISTEN)
master 1315 root 13u IPv4 24780 0t0 TCP VM-4-5-centos:smtp (LISTEN)
master 1315 root 14u IPv6 24781 0t0 TCP VM-4-5-centos:smtp (LISTEN)
openresty 9447 root 6u IPv4 1893732 0t0 TCP *:9527 (LISTEN)
docker-pr 9645 root 4u IPv6 73370 0t0 TCP *:http (LISTEN)
sshd 10249 root 3u IPv4 73396364 0t0 TCP jacklee.cc:ssh->114.86.235.244:10747 (ESTABLISHED)
tat_agent 12959 root 17u IPv4 45248255 0t0 TCP jacklee.cc:50400->169.254.0.138:d-s-n (ESTABLISHED)
YDService 18879 root 9u IPv4 8672424 0t0 TCP jacklee.cc:54494->169.254.0.55:lsi-bobcat (ESTABLISHED)
openresty 20135 root 6u IPv4 1893732 0t0 TCP *:9527 (LISTEN)
barad_age 29677 root 12u IPv4 74345158 0t0 TCP jacklee.cc:35870->169.254.0.4:http (ESTABLISHED)
docker-pr 30205 root 4u IPv6 20816493 0t0 TCP *:mysql (LISTEN)
=
3 选项
# -a 结果进行“与”运算
# -i 查看网络连接的情况,包括连接的ip、端口等以及一些服务的连接情况
lsof -i 6
lsof -itcp
lsof -i:22
lsof -i@172.16.12.5
lsof -i@172.16.12.5:22
lsof -i -sTCP:LISTEN
lsof -i -sTCP:ESTABLISHED
# -l 输出内容显示用户ID而不是用户名
# -n 显示IP 而不是主机名
# -p 查看指定进程pid已打开的内容
# -P 以数字方式显示端口
# -r 命令持续执行,直到收到中断信号
# +r 命令持续执行,直到没有输出内容
# -s 列出所有打开文件的大小,如果没有大小,则留下空白
# -t 仅返回 pid
# -u 指定 user
=
4 高频用法
# 显示与指定文件交互的所有一切
lsof /path/firewall_whitelist.txt
# 22端口现在运行什么程序
lsof -i:22
# 看 pid=12 的进程打开了哪些文件
lsof -p 12
# 显示目录下被进程开启的文件
lsof +d /usr/local/
lsof +D /usr/local/ # 递归搜索
# 查看指定命令打开的所有文件(以ping为例)
lsof -p `pidof ping`
# 消灭指定用户运行的所有东西
kill -9 `lsof -t -u jack`
=
5 高级操作
# 显示daniel连接到1.1.1.1所做的一切
lsof -u daniel -i @1.1.1.1
# 显示所有打开的链接数小于1的文件
lsof +L1
# 显示某个【端口范围】的打开的连接
lsof -i @fw.google.com:2150=2180
==
6 磁盘空间无法释放的问题
某文件正在被进程占用时,直接删除会导致系统无法释放这部分磁盘空间
# 说明:-n 选项,显示IP而不是主机名(能提高命令的执行速度)
lsof -n |& grep -v "UID" | grep deleted >> deleted.log
PORTS="awk '{print $2}' deleted.log | sort | uniq -c | sort -nr | grep -v "delete" |grep -v "tmp" | awk '{print $2}'" && echo $PORTS
for i in $PORTS ; do pidof $i ; done
kill -9 $PORTS
==
wan