1、概述 lsof(list open files)是一个列出当前系统打开文件信息的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。 2、关键选项 使用lsof用于获取系统怎么和网络交互的信息; (1)使用 -i 获取网络连接
root@alientek_imx6ul:~
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root 40u IPv4 3902 0t0 TCP localhost:gpsd (LISTEN)
gpsd 219 gpsd 4u IPv4 3902 0t0 TCP localhost:gpsd (LISTEN)
sshd 414 root 3u IPv4 6309 0t0 TCP *:ssh (LISTEN)
ntpd 499 ntp 16u IPv4 6382 0t0 UDP *:ntp
ntpd 499 ntp 17u IPv4 6386 0t0 UDP localhost:ntp
ntpd 499 ntp 21u IPv4 7024 0t0 UDP 192.168.0.27:ntp
ntpd 499 ntp 22u IPv4 7026 0t0 UDP 192.168.1.1:ntp
sshd 6564 root 3u IPv4 16168 0t0 TCP 192.168.0.27:ssh-
如果知道线程使用的端口号,可以使用使用"lsof -i:端口号"来获取使用该端口号的线程信息;
root@alientek_imx6ul:~
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node\x20/ 806 root 20u IPv4 7797 0t0 TCP *:http (LISTEN)
(2)使用-p查看指定进程ID已打开的内容
root@alientek_imx6ul:~
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
process 31590 root rtd DIR 179,2 4096 2 /
process 31590 root mem REG 179,2 14172 404889 /lib/arm-linux-gnueabihf/libanl-2.23.so
process 31590 root mem REG 179,2 897088 404822 /lib/arm-linux-gnueabihf/libc-2.23.so
process 31590 root mem REG 179,2 99372 404734 /lib/arm-linux-gnueabihf/libgcc_s.so.1
process 31590 root mem REG 179,2 424556 404718 /lib/arm-linux-gnueabihf/libm-2.23.so
process 31590 root mem REG 179,2 1032056 26028 /usr/lib/arm-linux-gnueabihf/libstdc++.so.6.0.21
process 31590 root mem REG 179,2 109972 404832 /lib/arm-linux-gnueabihf/libpthread-2.23.so
process 31590 root mem REG 179,2 442048 405049 /lib/libpaho-mqtt3a.so.1
process 31590 root mem REG 179,2 102668 404731 /lib/arm-linux-gnueabihf/ld-2.23.so
可以使用这个命令统计线程打开的文件个数,来分析线程是否有文件描述符泄露;
工作中应用场景: 嵌入式程序稳定性测试过程中,程序跑了三天,发现应用程序退出,打印信息显示文件描述符使用太多,如下面的系统错误打印,
[DEBUG] >> error:Too many open files
我们可以写一个脚本,获取嵌入式程序的线程号,然后分别测试哪项功能会影响文件描述符的增加;
|