过程监控——lsof
进程监控是对 IT 系统或组织内进程的持续观察和分析,以确保最佳性能、效率和合规性。它涉及跟踪系统上运行的各个进程或应用程序的关键指标、资源利用率和行为。这种做法有助于在异常、瓶颈或潜在问题影响整体系统性能或用户体验之前识别它们。进程监控工具通常提供有关 CPU 使用率、内存消耗、I/O 操作和线程活动的实时数据。它们通常包括用于警报、记录和可视化进程数据的功能。在现代 IT 环境中,进程监控对于维护系统稳定性、优化资源分配、解决性能问题以及支持复杂分布式系统中的容量规划至关重要。
Lsof 在其标准输出文件中列出了有关进程打开的文件的信息。
一、lsof命令简介
lsof
(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。如TCP和UDP等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。
lsof
(list open files)是一个在 Unix 和类 Unix 系统(如 Linux)中非常有用的命令行工具,其主要功能是列出当前系统中所有被打开的文件信息。在 Unix/Linux 系统里,很多事物都可被当作文件处理,像常规文件、目录、网络套接字、设备文件等,所以lsof
能提供丰富的系统运行状态信息。
二、lsof命令功能
- 排查文件占用问题:当你尝试删除或移动某个文件却失败时,借助
lsof
可以找出是哪个进程正在使用该文件。 - 网络连接分析:能够查看哪些进程正在使用网络套接字,这有助于发现异常的网络连接或者监控网络服务的运行状况。
- 系统资源监控:通过查看打开的文件和设备,了解系统中各个进程的资源使用情况。
三、lsof命令输出字段说明
[root@Rocky ~]# lsof | head -n3
COMMAND PID TID TASKCMD USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 253,0 224 128 /
systemd 1 root rtd DIR 253,0 224 128 /
- COMMAND:打开文件的进程名称
- PID:进程的ID
- USER:打开文件的用户
- FD:文件描述符,它是一个整数,用于标识进程内的文件
- TYPE:文件的类型,如REG(常规文件)、DIR(目录)、CHR(字符设备)、BLK(块设备)、IPv4(IPv4 套接字)等。
- DEVICE:设备号,指定磁盘的名称
- SIZE/OFF:文件的大小或偏移量
- NODE:文件的inode号
- NAME:文件的名称或网络连接信息
四、lsof命令常见参数及示例
参数 | 解释 |
---|---|
-p <pid> | 根据进程ID列出该进程打开的所有文件 |
-u <username> | 根据用户名列出该用户打开的所有文件 |
-d <fd> | 指定文件描述符(FD),列出使用该文件描述符的进程 |
-c <cmd> | 列出命令名以指定字符串开头的进程所打开的文件 |
/path/to/file | 直接在命令后添加文件路径,可列出所有打开该文件的进程 |
-i -i <protocol> -i :<port> | 列出所有打开的网络连接,包括 TCP 和 UDP 连接 指定网络协议,列出使用该协议的网络连接 列出使用指定端口的网络连接 |
-a | 逻辑与(and);当不使用-a时,逻辑或(or) |
-r <time> | 以time(秒)周期性的执行命令并输出结果,默认15s |
-c <cmd> | 列出命令名以指定字符串开头的进程所打开的文件 |
-s | 用于指定网络套接字的状态。 |
-
显示开启文件的进程
[root@Rocky ~]# lsof | head -n3 COMMAND PID TID TASKCMD USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1 root cwd DIR 253,0 224 128 / systemd 1 root rtd DIR 253,0 224 128 /
-
递归查看某个目录的文件信息
[root@Rocky ~]# lsof +D /etc COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1 root mem REG 253,0 19084 68793357 /etc/selinux/targeted/contexts/files/file_contexts.homedirs.bin systemd 1 root mem REG 253,0 567207 68993028 /etc/selinux/targeted/contexts/files/file_contexts.bin systemd-u 671 root mem REG 253,0 11120017 67841948 /etc/udev/hwdb.bin systemd-u 671 root mem REG 253,0 19084 68793357 /etc/selinux/targeted/contexts/files/file_contexts.homedirs.bin systemd-u 671 root mem REG 253,0 567207 68993028 /etc/selinux/targeted/contexts/files/file_contexts.bin systemd-u 671 root 6r REG 253,0 11120017 67841948 /etc/udev/hwdb.bin systemd-l 786 root mem REG 253,0 19084 68793357 /etc/selinux/targeted/contexts/files/file_contexts.homedirs.bin systemd-l 786 root mem REG 253,0 567207 68993028 /etc/selinux/targeted/contexts/files/file_contexts.bin (sd-pam) 2135 root mem REG 253,0 19084 68793357 /etc/selinux/targeted/contexts/files/file_contexts.homedirs.bin (sd-pam) 2135 root mem REG 253,0 567207 68993028 /etc/selinux/targeted/contexts/files/file_contexts.bin
-
列出某个用户打开的文件信息
[root@Rocky ~]# lsof -u mysql|tail mysqld 1673 mysql 35uW REG 253,0 81920 334586 /var/lib/mysql/#innodb_temp/temp_4.ibt mysqld 1673 mysql 36uW REG 253,0 81920 334588 /var/lib/mysql/#innodb_temp/temp_5.ibt mysqld 1673 mysql 37uW REG 253,0 81920 334589 /var/lib/mysql/#innodb_temp/temp_6.ibt mysqld 1673 mysql 38uW REG 253,0 81920 334590 /var/lib/mysql/#innodb_temp/temp_7.ibt mysqld 1673 mysql 39uW REG 253,0 81920 334591 /var/lib/mysql/#innodb_temp/temp_8.ibt mysqld 1673 mysql 40uW REG 253,0 81920 324416 /var/lib/mysql/#innodb_temp/temp_9.ibt mysqld 1673 mysql 41uW REG 253,0 81920 324417 /var/lib/mysql/#innodb_temp/temp_10.ibt mysqld 1673 mysql 42uW REG 253,0 114688 34515287 /var/lib/mysql/mysql/wsrep_cluster.ibd mysqld 1673 mysql 43uW REG 253,0 114688 34515289 /var/lib/mysql/mysql/wsrep_streaming_log.ibd mysqld 1673 mysql 44uW REG 253,0 114688 34515288 /var/lib/mysql/mysql/wsrep_cluster_members.ibd
-
列出某个程序进程所打开的文件信息
[root@Rocky ~]# lsof -c mysql | grep IP mysqld 1673 mysql 9u IPv4 28623 0t0 TCP *:tram (LISTEN) mysqld 1673 mysql 27u IPv6 28642 0t0 TCP *:mysqlx (LISTEN) mysqld 1673 mysql 29u IPv6 28645 0t0 TCP *:mysql (LISTEN)
-
列出多个进程多个打开的文件信息
[root@Rocky ~]# lsof -c mysql -i:8080 | head -n10 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld 1673 mysql cwd DIR 253,0 4096 101651191 /var/lib/mysql mysqld 1673 mysql rtd DIR 253,0 224 128 / mysqld 1673 mysql txt REG 253,0 67906624 101651146 /usr/sbin/mysqld mysqld 1673 mysql mem REG 253,0 413280 101651030 /usr/lib64/mysql/plugin/component_percona_telemetry.so mysqld 1673 mysql DEL REG 0,18 28639 /[aio] mysqld 1673 mysql DEL REG 0,18 28638 /[aio] mysqld 1673 mysql DEL REG 0,18 28637 /[aio] mysqld 1673 mysql DEL REG 0,18 28636 /[aio] mysqld 1673 mysql DEL REG 0,18 28635 /[aio]
-
列出某个IP的连接信息
[root@Rocky ~]# lsof -i @Rocky COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 2116 root 4u IPv4 30264 0t0 TCP pxc1:ssh->172.25.254.1:64076 (ESTABLISHED) sshd 2128 root 4u IPv4 31468 0t0 TCP pxc1:ssh->172.25.254.1:64094 (ESTABLISHED) sshd 2143 root 4u IPv4 30264 0t0 TCP pxc1:ssh->172.25.254.1:64076 (ESTABLISHED) sshd 2170 root 4u IPv4 31468 0t0 TCP pxc1:ssh->172.25.254.1:64094 (ESTABLISHED)
-
根据IP分类显示当前环境的连接信息
## 列出IPv4 [root@Rocky ~]# lsof -i 4 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 795 root 3u IPv4 26376 0t0 TCP *:ssh (LISTEN) mysqld 1673 mysql 9u IPv4 28623 0t0 TCP *:tram (LISTEN) sshd 2116 root 4u IPv4 30264 0t0 TCP pxc1:ssh->172.25.254.1:64076 (ESTABLISHED) sshd 2128 root 4u IPv4 31468 0t0 TCP pxc1:ssh->172.25.254.1:64094 (ESTABLISHED) sshd 2143 root 4u IPv4 30264 0t0 TCP pxc1:ssh->172.25.254.1:64076 (ESTABLISHED) sshd 2170 root 4u IPv4 31468 0t0 TCP pxc1:ssh->172.25.254.1:64094 (ESTABLISHED) ## 列出IPv6 [root@Rocky ~]# lsof -i 6 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 795 root 4u IPv6 26378 0t0 TCP *:ssh (LISTEN) mysqld 1673 mysql 27u IPv6 28642 0t0 TCP *:mysqlx (LISTEN) mysqld 1673 mysql 29u IPv6 28645 0t0 TCP *:mysql (LISTEN)
-
列出TCP/UDP的连接信息
[root@Rocky ~]# lsof -i tcp COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 795 root 3u IPv4 26376 0t0 TCP *:ssh (LISTEN) sshd 795 root 4u IPv6 26378 0t0 TCP *:ssh (LISTEN) mysqld 1673 mysql 9u IPv4 28623 0t0 TCP *:tram (LISTEN) mysqld 1673 mysql 27u IPv6 28642 0t0 TCP *:mysqlx (LISTEN) mysqld 1673 mysql 29u IPv6 28645 0t0 TCP *:mysql (LISTEN) sshd 2116 root 4u IPv4 30264 0t0 TCP pxc1:ssh->172.25.254.1:64076 (ESTABLISHED) sshd 2128 root 4u IPv4 31468 0t0 TCP pxc1:ssh->172.25.254.1:64094 (ESTABLISHED) sshd 2143 root 4u IPv4 30264 0t0 TCP pxc1:ssh->172.25.254.1:64076 (ESTABLISHED) sshd 2170 root 4u IPv4 31468 0t0 TCP pxc1:ssh->172.25.254.1:64094 (ESTABLISHED) [root@Rocky ~]# lsof -i udp [root@Rocky ~]# lsof -i tcp:22 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 795 root 3u IPv4 26376 0t0 TCP *:ssh (LISTEN) sshd 795 root 4u IPv6 26378 0t0 TCP *:ssh (LISTEN) sshd 2116 root 4u IPv4 30264 0t0 TCP pxc1:ssh->172.25.254.1:64076 (ESTABLISHED) sshd 2128 root 4u IPv4 31468 0t0 TCP pxc1:ssh->172.25.254.1:64094 (ESTABLISHED) sshd 2143 root 4u IPv4 30264 0t0 TCP pxc1:ssh->172.25.254.1:64076 (ESTABLISHED) sshd 2170 root 4u IPv4 31468 0t0 TCP pxc1:ssh->172.25.254.1:64094 (ESTABLISHED)
-
列出除了某个用户外的被打开的文件信息
[root@Rocky ~]# lsof -u ^root|head -n10 COMMAND PID TID TASKCMD USER FD TYPE DEVICE SIZE/OFF NODE NAME dbus-daem 782 dbus cwd DIR 253,0 224 128 / dbus-daem 782 dbus rtd DIR 253,0 224 128 / dbus-daem 782 dbus txt REG 253,0 245456 67794611 /usr/bin/dbus-daemon dbus-daem 782 dbus mem REG 253,0 948648 101245581 /usr/lib64/libnss_systemd.so.2 dbus-daem 782 dbus mem REG 253,0 46408 101443687 /usr/lib64/libnss_sss.so.2 dbus-daem 782 dbus mem REG 253,0 54360 100673090 /usr/lib64/libnss_files-2.28.so dbus-daem 782 dbus mem REG 253,0 138792 100686630 /usr/lib64/libgpg-error.so.0.24.2 dbus-daem 782 dbus mem REG 253,0 33488 100686674 /usr/lib64/libuuid.so.1.3.0 dbus-daem 782 dbus mem REG 253,0 343608 101245590 /usr/lib64/libblkid.so.1.1.0
-
列出某个用户的所有活跃的网络端口
[root@Rocky ~]# lsof -a -u root -i COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 795 root 3u IPv4 26376 0t0 TCP *:ssh (LISTEN) sshd 795 root 4u IPv6 26378 0t0 TCP *:ssh (LISTEN) sshd 2116 root 4u IPv4 30264 0t0 TCP pxc1:ssh->172.25.254.1:64076 (ESTABLISHED) sshd 2128 root 4u IPv4 31468 0t0 TCP pxc1:ssh->172.25.254.1:64094 (ESTABLISHED) sshd 2143 root 4u IPv4 30264 0t0 TCP pxc1:ssh->172.25.254.1:64076 (ESTABLISHED) sshd 2170 root 4u IPv4 31468 0t0 TCP pxc1:ssh->172.25.254.1:64094 (ESTABLISHED)
-
通过进程号显示该进程打开的文件
[root@Rocky ~]# ps -ef | grep mysql mysql 1673 1 1 15:56 ? 00:00:45 /usr/sbin/mysqld --wsrep_start_position=b5efac34-027b-11f0-9438-c63bffe159ec:6 root 2350 2144 0 17:10 pts/0 00:00:00 grep --color=auto mysql [root@Rocky ~]# lsof -p 1673 | head -n3 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld 1673 mysql cwd DIR 253,0 4096 101651191 /var/lib/mysql mysqld 1673 mysql rtd DIR 253,0 224 128 /
-
列出COMMAND列中包含字符串" mysql",且文件描符的类型为mem,用户为root的文件信息
[root@Rocky ~]# lsof -c mysql -a -d men -u root
-
列出被进程号为1673的进程所打开的所有IPV4 network files
[root@Rocky ~]# lsof -i 4 -a -p 1673 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld 1673 mysql 9u IPv4 28623 0t0 TCP *:tram (LISTEN)
-
列出被进程号为1673的进程所打开的所有IPV4 network files并且每隔3秒不断的执行
[root@Rocky ~]# lsof -i 4 -a -p 1673 -r 3 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld 1673 mysql 9u IPv4 28623 0t0 TCP *:tram (LISTEN) ======= COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld 1673 mysql 9u IPv4 28623 0t0 TCP *:tram (LISTEN) ======= COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld 1673 mysql 9u IPv4 28623 0t0 TCP *:tram (LISTEN) =======
-
找出正等候连接的端口
[root@Rocky ~]# lsof -i -sTCP:LISTEN COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 795 root 3u IPv4 26376 0t0 TCP *:ssh (LISTEN) sshd 795 root 4u IPv6 26378 0t0 TCP *:ssh (LISTEN) mysqld 1673 mysql 9u IPv4 28623 0t0 TCP *:tram (LISTEN) mysqld 1673 mysql 27u IPv6 28642 0t0 TCP *:mysqlx (LISTEN) mysqld 1673 mysql 29u IPv6 28645 0t0 TCP *:mysql (LISTEN) [root@Rocky ~]# lsof -i | grep -i LISTEN sshd 795 root 3u IPv4 26376 0t0 TCP *:ssh (LISTEN) sshd 795 root 4u IPv6 26378 0t0 TCP *:ssh (LISTEN) mysqld 1673 mysql 9u IPv4 28623 0t0 TCP *:tram (LISTEN) mysqld 1673 mysql 27u IPv6 28642 0t0 TCP *:mysqlx (LISTEN) mysqld 1673 mysql 29u IPv6 28645 0t0 TCP *:mysql (LISTEN)