lsof 常用命令汇总
文章目录
lsof 常用命令汇总
按照网络状态筛选进程的 fd
|
|
-
-a
表示 and, 前后两个条件要一起生效 -
-i
和-s
一起用,表示可以按照 TCP/UDP 状态来筛选 fd -
列出进程
<pid>
建立的所有 TCP 连接
|
|
- 列出进程
<pid>
所有 IDLE 状态的 UDP 连接
|
|
根据 Unix 发行版本的不同,TCP/UDP 状态也会有不同的名字:
- 常用的 TCP 状态是:
CLOSED
,IDLE
,BOUND
,LISTEN
,ESTABLISHED
,SYN_SENT
,SYN_RCDV
,ESTABLISHED
,CLOSE_WAIT
,FIN_WAIT1
,CLOSING
,LAST_ACK
,FIN_WAIT_2
,TIME_WAIT
. - 常用的 UDP 状态是:
Unbound
,Idle
按照 fd number 查找进程的 fd
使用 strace
查看进程的系统调用的时候,经常能够看到在某个 fd 上执行读写操作,例如:
|
|
我们想要查一下这个 267 和 5405 具体代表了什么连接,可以用
|
|
例如我利用 strace 查看飞书 app 的系统调用,看到以下的信息
|
|
我想知道 fd 4 代表了什么,执行 sudo lsof -d 4 -a -p 8261
,可以看到它是我的电脑和 220.181.131.241
建立的一个 https 连接。
|
|
查看端口占用
有时候我们启动程序的时候,发现端口被占用了,可以用 lsof -i:xxx
来查看端口被哪个进程占用了,例如:
下面这条命令显示 3306 端口被 360702
和 360709
两个进程占用了。
|
|
查看容器的网络调用
构建镜像
- download.py
|
|
- Dockerfile
|
|
准备上述两个文件,然后执行
|
|
构建我们用于调试的镜像, test_download
。
启动阻塞的容器
执行以下命令,启动一个阻塞在网络请求中的容器。
|
|
Note:
这个例子不太好,因为
releases.ubuntu.com
还比较健康,会持续地返回内容,现实中我们遇到的情况是,服务器完全不返回内容,客户端也没有设置超时时间,完全处于阻塞的状态。
查找容器的 pid
根据容器的 ID, 我们通过 docker inspect <id>| rg -i pid
可以获得容器的进程 ID, 如果你使用的是 containerd, 可以使用 crictl inspect <id> | rg -i pid
|
|
利用 strace 查看进程的状态
从 strace 的输出中可以看到,进程一直在从 3 号 fd 上读取数据
|
|
利用 lsof 查看 fd 详细信息
|
|
|
|
可以看到,3号fd 是一个TCP 连接,本地的 172.17.0.2:55378
连接了远端的 https-services.aerodent.canonical.com:https
Note
如果我们不加 nsenter -n -t 来切换 network namespace 的话,lsof 输出的信息中就没有详细的客户端和服务端的地址了
|
|