深入探索Linux的lsof命令
在Linux系统中,了解哪些文件被哪些进程打开对于系统管理和问题诊断是极其重要的。这正是lsof
命令,即List Open Files,发挥其强大功能的场景。本文旨在详细介绍lsof
的起源、底层原理、参数意义,常见用法,并详解其返回结果的每个字段含义。此外,我们将讨论在使用lsof
命令时需要注意的事项。
1. lsof的起源与演变 🌟
lsof
最初由Victor A. Abell在1987年开发,目的是为了帮助Unix系统的管理员和开发人员更好地监控和诊断系统问题。随着时间的推移,lsof
已经成为Linux系统中不可或缺的诊断工具。
2. 底层原理 🔍
lsof
通过访问Linux的/proc
文件系统来获取信息。/proc
文件系统包含了系统运行中的进程详情,包括但不限于打开的文件、网络连接等。lsof
解析这些信息,并以用户友好的格式呈现。
3. 参数详解 📚
-d <描述符>
:显示指定文件描述符的文件。-u <用户>
:显示特定用户打开的文件。-c <命令>
:显示由特定命令打开的文件。-p <PID>
:显示特定进程打开的文件。-i
:显示所有网络连接。-n
:直接显示IP地址,不进行域名解析,以加快处理速度。-l
:显示登录用户名称而非ID。+D <目录>
:显示特定目录下打开的文件。-a
:用于多个条件的组合
4. 常见用法示例 🛠
4.1. 查看所有网络连接
命令:lsof -i
举例如下:
root@containerd:~# lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd-r 806 systemd-resolve 13u IPv4 482 0t0 UDP localhost:domain
systemd-r 806 systemd-resolve 14u IPv4 483 0t0 TCP localhost:domain (LISTEN)
container 859 root 10u IPv4 20344 0t0 TCP localhost:45543 (LISTEN)
chronyd 883 _chrony 5u IPv4 23928 0t0 UDP localhost:323
chronyd 883 _chrony 6u IPv6 23929 0t0 UDP ip6-localhost:323
sshd 1105 root 4u IPv4 32344 0t0 TCP containerd:ssh->192.168.11.1:64450 (ESTABLISHED)
sshd 1105 root 5u IPv6 20463 0t0 TCP ip6-localhost:6010 (LISTEN)
sshd 1105 root 7u IPv4 20464 0t0 TCP localhost:6010 (LISTEN)
sshd 18290 root 3u IPv4 48775 0t0 TCP *:ssh (LISTEN)
root@containerd:~#
4.2. 查看特定用户打开的文件
命令:lsof -u <username>
举例如下:
root@containerd:~# lsof -u _chrony
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
chronyd 89320 _chrony cwd DIR 253,0 300 128 /
chronyd 89320 _chrony rtd DIR 253,0 300 128 /
chronyd 89320 _chrony txt REG 253,0 285712 292271 /usr/sbin/chronyd (deleted)
chronyd 89320 _chrony mem REG 253,0 526896 134393888 /usr/lib/x86_64-linux-gnu/libgmp.so.10.4.1
chronyd 89320 _chrony mem REG 253,0 289800 134393900 /usr/lib/x86_64-linux-gnu/libhogweed.so.6.4
chronyd 89320 _chrony mem REG 253,0 1743016 134598162 /usr/lib/x86_64-linux-gnu/libunistring.so.2.2.0
chronyd 89320 _chrony mem REG 253,0 2220400 134797001 /usr/lib/x86_64-linux-gnu/libc.so.6
chronyd 89320 _chrony mem REG 253,0 47688 134393875 /usr/lib/x86_64-linux-gnu/libffi.so.8.1.0
chronyd 89320 _chrony mem REG 253,0 92312 134598155 /usr/lib/x86_64-linux-gnu/libtasn1.so.6.6.2
chronyd 89320 _chrony mem REG 253,0 129096 134393907 /usr/lib/x86_64-linux-gnu/libidn2.so.0.3.7
chronyd 89320 _chrony mem REG 253,0 1285888 134538208 /usr/lib/x86_64-linux-gnu/libp11-kit.so.0.3.0
chronyd 89320 _chrony mem REG 253,0 125360 134538237 /usr/lib/x86_64-linux-gnu/libseccomp.so.2.5.3
chronyd 89320 _chrony mem REG 253,0 39024 134318281 /usr/lib/x86_64-linux-gnu/libcap.so.2.44
chronyd 89320 _chrony mem REG 253,0 2000320 134318753 /usr/lib/x86_64-linux-gnu/libgnutls.so.30.31.0
chronyd 89320 _chrony mem REG 253,0 281000 134538195 /usr/lib/x86_64-linux-gnu/libnettle.so.8.4
chronyd 89320 _chrony mem REG 253,0 940560 134797004 /usr/lib/x86_64-linux-gnu/libm.so.6
chronyd 89320 _chrony mem REG 253,0 240936 134331442 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
chronyd 89320 _chrony 0r CHR 1,3 0t0 5 /dev/null
chronyd 89320 _chrony 1w CHR 1,3 0t0 5 /dev/null
chronyd 89320 _chrony 2u CHR 1,3 0t0 5 /dev/null
chronyd 89320 _chrony 3u unix 0xffff96061c7b8400 0t0 123976 type=DGRAM
chronyd 89320 _chrony 5u IPv4 123981 0t0 UDP localhost:323
chronyd 89320 _chrony 6u IPv6 123982 0t0 UDP ip6-localhost:323
chronyd 89320 _chrony 7u unix 0xffff96061c7bd400 0t0 123983 /run/chrony/chronyd.sock type=DGRAM
chronyd 89320 _chrony 8u unix 0xffff96061c7bb800 0t0 123984 type=SEQPACKET
chronyd 89321 _chrony cwd DIR 253,0 300 128 /
chronyd 89321 _chrony rtd DIR 253,0 300 128 /
chronyd 89321 _chrony txt REG 253,0 285712 292271 /usr/sbin/chronyd (deleted)
chronyd 89321 _chrony mem REG 253,0 526896 134393888 /usr/lib/x86_64-linux-gnu/libgmp.so.10.4.1
chronyd 89321 _chrony mem REG 253,0 289800 134393900 /usr/lib/x86_64-linux-gnu/libhogweed.so.6.4
chronyd 89321 _chrony mem REG 253,0 1743016 134598162 /usr/lib/x86_64-linux-gnu/libunistring.so.2.2.0
chronyd 89321 _chrony mem REG 253,0 2220400 134797001 /usr/lib/x86_64-linux-gnu/libc.so.6
chronyd 89321 _chrony mem REG 253,0 47688 134393875 /usr/lib/x86_64-linux-gnu/libffi.so.8.1.0
chronyd 89321 _chrony mem REG 253,0 92312 134598155 /usr/lib/x86_64-linux-gnu/libtasn1.so.6.6.2
chronyd 89321 _chrony mem REG 253,0 129096 134393907 /usr/lib/x86_64-linux-gnu/libidn2.so.0.3.7
chronyd 89321 _chrony mem REG 253,0 1285888 134538208 /usr/lib/x86_64-linux-gnu/libp11-kit.so.0.3.0
chronyd 89321 _chrony mem REG 253,0 125360 134538237 /usr/lib/x86_64-linux-gnu/libseccomp.so.2.5.3
chronyd 89321 _chrony mem REG 253,0 39024 134318281 /usr/lib/x86_64-linux-gnu/libcap.so.2.44
chronyd 89321 _chrony mem REG 253,0 2000320 134318753 /usr/lib/x86_64-linux-gnu/libgnutls.so.30.31.0
chronyd 89321 _chrony mem REG 253,0 281000 134538195 /usr/lib/x86_64-linux-gnu/libnettle.so.8.4
chronyd 89321 _chrony mem REG 253,0 940560 134797004 /usr/lib/x86_64-linux-gnu/libm.so.6
chronyd 89321 _chrony mem REG 253,0 240936 134331442 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
chronyd 89321 _chrony 0r CHR 1,3 0t0 5 /dev/null
chronyd 89321 _chrony 1w CHR 1,3 0t0 5 /dev/null
chronyd 89321 _chrony 2u CHR 1,3 0t0 5 /dev/null
chronyd 89321 _chrony 9u unix 0xffff96061c7be400 0t0 123985 type=SEQPACKET
root@containerd:~#
4.3. 列出某个程序打开的文件
命令:lsof -c <app-name>
举例如下:
root@containerd:~# lsof -c containerd
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
container 859 root cwd DIR 253,0 300 128 /
container 859 root rtd DIR 253,0 300 128 /
container 859 root txt REG 253,0 38939752 203321724 /usr/local/bin/containerd
container 859 root mem-W REG 253,0 262144 135005784 /var/lib/containerd/io.containerd.metadata.v1.bolt/meta.db
container 859 root 0r CHR 1,3 0t0 5 /dev/null
container 859 root 1u unix 0xffff960611bf7c00 0t0 21764 type=STREAM
container 859 root 2u unix 0xffff960611bf7c00 0t0 21764 type=STREAM
container 859 root 3uW REG 253,0 262144 135005784 /var/lib/containerd/io.containerd.metadata.v1.bolt/meta.db
container 859 root 4u a_inode 0,14 0 1053 [eventpoll]
container 859 root 5r FIFO 0,13 0t0 19451 pipe
container 859 root 6w FIFO 0,13 0t0 19451 pipe
container 859 root 7r a_inode 0,14 0 1053 inotify
container 859 root 8u unix 0xffff96061c390c00 0t0 553 /run/containerd/containerd.sock.ttrpc type=STREAM
container 859 root 9u unix 0xffff96061c390800 0t0 554 /run/containerd/containerd.sock type=STREAM
container 859 root 10u IPv4 20344 0t0 TCP localhost:45543 (LISTEN)
root@containerd:~#
4.4. 查看指定进程打开的文件
命令:lsof -p <pid>
举例如下:
root@containerd:~# ps -ef|grep containerd
root 859 1 0 22:33 ? 00:00:05 /usr/local/bin/containerd
root 52472 1141 0 23:02 pts/0 00:00:00 grep --color=auto containerd
root@containerd:~#
root@containerd:~#
root@containerd:~# lsof -p 859
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
container 859 root cwd DIR 253,0 300 128 /
container 859 root rtd DIR 253,0 300 128 /
container 859 root txt REG 253,0 38939752 203321724 /usr/local/bin/containerd
container 859 root mem-W REG 253,0 262144 135005784 /var/lib/containerd/io.containerd.metadata.v1.bolt/meta.db
container 859 root 0r CHR 1,3 0t0 5 /dev/null
container 859 root 1u unix 0xffff960611bf7c00 0t0 21764 type=STREAM
container 859 root 2u unix 0xffff960611bf7c00 0t0 21764 type=STREAM
container 859 root 3uW REG 253,0 262144 135005784 /var/lib/containerd/io.containerd.metadata.v1.bolt/meta.db
container 859 root 4u a_inode 0,14 0 1053 [eventpoll]
container 859 root 5r FIFO 0,13 0t0 19451 pipe
container 859 root 6w FIFO 0,13 0t0 19451 pipe
container 859 root 7r a_inode 0,14 0 1053 inotify
container 859 root 8u unix 0xffff96061c390c00 0t0 553 /run/containerd/containerd.sock.ttrpc type=STREAM
container 859 root 9u unix 0xffff96061c390800 0t0 554 /run/containerd/containerd.sock type=STREAM
container 859 root 10u IPv4 20344 0t0 TCP localhost:45543 (LISTEN)
root@containerd:~#
4.5. 查找监听特定端口的进程
命令:lsof -i :<port>
举例如下:
root@containerd:~# lsof -i :22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1105 root 4u IPv4 32344 0t0 TCP containerd:ssh->192.168.11.1:64450 (ESTABLISHED)
sshd 64873 root 4u IPv4 109217 0t0 TCP containerd:ssh->192.168.11.1:49324 (ESTABLISHED)
sshd 101308 root 3u IPv4 142285 0t0 TCP *:ssh (LISTEN)
root@containerd:~#
4.6. 查看所有处于监听状态的TCP连接
命令:lsof -i -sTCP:LISTEN
举例如下:
root@containerd:~# lsof -i -sTCP:LISTEN
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
container 859 root 10u IPv4 20344 0t0 TCP localhost:45543 (LISTEN)
sshd 1105 root 5u IPv6 20463 0t0 TCP ip6-localhost:6010 (LISTEN)
sshd 1105 root 7u IPv4 20464 0t0 TCP localhost:6010 (LISTEN)
sshd 64873 root 5u IPv6 106249 0t0 TCP ip6-localhost:6011 (LISTEN)
sshd 64873 root 7u IPv4 106250 0t0 TCP localhost:6011 (LISTEN)
systemd-r 90947 systemd-resolve 14u IPv4 126817 0t0 TCP localhost:domain (LISTEN)
sshd 101308 root 3u IPv4 142285 0t0 TCP *:ssh (LISTEN)
root@containerd:~#
4.7. 查看所有处于建立好连接的TCP
命令:lsof -i -sTCP:ESTABLISHED
举例如下:
root@containerd:~# lsof -i -sTCP:ESTABLISHED
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1105 root 4u IPv4 32344 0t0 TCP containerd:ssh->192.168.11.1:64450 (ESTABLISHED)
sshd 64873 root 4u IPv4 109217 0t0 TCP containerd:ssh->192.168.11.1:49324 (ESTABLISHED)
root@containerd:~#
4.8. 查看指定进程监听的端口
命令:lsof -i -a -p <port>
举例如下:
root@containerd:~# ps -ef|grep sshd
root 1105 1 0 22:34 ? 00:00:02 sshd: root@pts/0
root 64873 1 0 23:05 ? 00:00:00 sshd: root@pts/2
root 101308 1 0 23:06 ? 00:00:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
root 137623 66196 0 23:26 pts/2 00:00:00 grep --color=auto sshd
root@containerd:~#
root@containerd:~#
root@containerd:~# lsof -i -a -p 101308 -n
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 101308 root 3u IPv4 142285 0t0 TCP *:ssh (LISTEN)
root@containerd:~#
4.9. 查看指定命令监听的端口
命令:lsof -i -a -c <command>
举例如下:
root@containerd:~# lsof -i -a -c sshd
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1105 root 4u IPv4 32344 0t0 TCP containerd:ssh->192.168.11.1:64450 (ESTABLISHED)
sshd 1105 root 5u IPv6 20463 0t0 TCP ip6-localhost:6010 (LISTEN)
sshd 1105 root 7u IPv4 20464 0t0 TCP localhost:6010 (LISTEN)
sshd 64873 root 4u IPv4 109217 0t0 TCP containerd:ssh->192.168.11.1:49324 (ESTABLISHED)
sshd 64873 root 5u IPv6 106249 0t0 TCP ip6-localhost:6011 (LISTEN)
sshd 64873 root 7u IPv4 106250 0t0 TCP localhost:6011 (LISTEN)
sshd 101308 root 3u IPv4 142285 0t0 TCP *:ssh (LISTEN)
root@containerd:~#
root@containerd:~# lsof -i -a -c chrony
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
chronyd 101640 _chrony 5u IPv4 149537 0t0 UDP localhost:323
chronyd 101640 _chrony 6u IPv6 149538 0t0 UDP ip6-localhost:323
root@containerd:~#
4.10. 查看所有TCP连接
命令:lsof -i tcp
举例如下:
root@containerd:~# lsof -i tcp
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
container 859 root 10u IPv4 20344 0t0 TCP localhost:45543 (LISTEN)
sshd 1105 root 4u IPv4 32344 0t0 TCP containerd:ssh->192.168.11.1:64450 (ESTABLISHED)
sshd 1105 root 5u IPv6 20463 0t0 TCP ip6-localhost:6010 (LISTEN)
sshd 1105 root 7u IPv4 20464 0t0 TCP localhost:6010 (LISTEN)
sshd 64873 root 4u IPv4 109217 0t0 TCP containerd:ssh->192.168.11.1:49324 (ESTABLISHED)
sshd 64873 root 5u IPv6 106249 0t0 TCP ip6-localhost:6011 (LISTEN)
sshd 64873 root 7u IPv4 106250 0t0 TCP localhost:6011 (LISTEN)
systemd-r 90947 systemd-resolve 14u IPv4 126817 0t0 TCP localhost:domain (LISTEN)
sshd 101308 root 3u IPv4 142285 0t0 TCP *:ssh (LISTEN)
root@containerd:~#
4.11. 查看所有UDP连接
命令:lsof -i udp
举例如下:
root@containerd:~#
root@containerd:~# lsof -i udp
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd-r 90947 systemd-resolve 13u IPv4 126816 0t0 UDP localhost:domain
chronyd 101640 _chrony 4u IPv4 178430 0t0 UDP containerd:48223->makaki.miuku.net:ntp
chronyd 101640 _chrony 5u IPv4 149537 0t0 UDP localhost:323
chronyd 101640 _chrony 6u IPv6 149538 0t0 UDP ip6-localhost:323
root@containerd:~#
4.12. 查找使用特定文件的进程
命令:lsof <file>
举例如下:
root@containerd:~#
root@containerd:~# lsof /var/log/kern.log
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsyslogd 116033 syslog 8w REG 253,0 175767 2527502 /var/log/kern.log
root@containerd:~#
root@containerd:~#
4.13. 查找使用特定目录的进程
命令:lsof +D <dir>
举例如下:
root@containerd:~# lsof +D /var/log
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
unattende 903 root 3w REG 253,0 1017 202394112 /var/log/unattended-upgrades/unattended-upgrades-shutdown.log
systemd-j 90949 root mem REG 253,0 8388608 22395 /var/log/journal/d552e0edef0141cc9cc9130e99db60ad/system.journal
systemd-j 90949 root 34u REG 253,0 8388608 22395 /var/log/journal/d552e0edef0141cc9cc9130e99db60ad/system.journal
atop 93576 root 5u REG 253,0 1839935 310270 /var/log/atop/atop_20240402
rsyslogd 116033 syslog 7w REG 253,0 197363 2527500 /var/log/syslog
rsyslogd 116033 syslog 8w REG 253,0 175767 2527502 /var/log/kern.log
rsyslogd 116033 syslog 9w REG 253,0 2287 208040 /var/log/auth.log
root@containerd:~#
5. 解读lsof的输出 📖
- COMMAND:打开文件的进程名,通常是启动进程的命令名。
- PID:每个运行中的进程在系统中都有一个唯一的标识符,即PID
- USER:进程所有者的用户名。
- FD:文件描述符,唯一标识打开的文件。
- TYPE:文件类型(如:DIR, REG)。
- DEVICE:显示文件所在的设备编号,可能是以“主设备号,次设备号”的方式,譬如
255,0
- SIZE/OFF:文件的大小或偏移量。
- 对于常规文件,显示文件的大小。
- 对于某些特殊文件,这可能是偏移量。
- NODE:文件的inode号码。
- NAME:文件名或网络连接的详细信息。
5.1. FD(文件描述符)
文件描述符是一个非负整数,它是UNIX和类UNIX操作系统(如Linux)用来访问文件或输入/输出资源的抽象标识。在lsof
的输出中,FD
列显示了被进程打开的文件的文件描述符,它可以有以下几种形式:
- 数字:如
0
、1
、2
分别代表标准输入(STDIN)、标准输出(STDOUT)、标准错误输出(STDERR)。 cwd
:代表当前工作目录。rtd
:代表根目录。txt
:表示程序代码。mem
:表示内存映射文件。- 数字w:数字后跟
w
,如1w
,表示文件是以写入模式打开的。 - 数字u:数字后跟
u
,如2u
,表示文件是以读写模式打开的。 - 数字r:数字后跟
r
,表示文件是以只读模式打开的。
5.2. TYPE(文件类型)
TYPE
列提供了有关打开文件的类型信息,这可以帮助你了解文件是如何被使用的。TYPE
列的值可能包括但不限于:
REG
:常规文件。表示普通的数据文件。DIR
:目录。CHR
:字符设备文件,如终端、打印机等。BLK
:块设备文件,如硬盘、光驱等。FIFO
:命名管道,用于进程间通信。SOCK
:Socket文件,用于网络通信。IPv4
和IPv6
:分别表示IPv4和IPv6的网络文件。unix
:表示Unix域Socket文件。
在lsof
命令的输出结果中,NAME
列是非常重要的一部分,它提供了被打开文件的名称或网络连接的详细信息。根据打开的资源类型,NAME
列的内容会有所不同。以下是NAME
列可能包含的信息类型及其含义的详细解释:
5.3. NAME
在lsof命令的输出结果中,NAME列是非常重要的一部分,它提供了被打开文件的名称或网络连接的详细信息。根据打开的资源类型,NAME列的内容会有所不同。以下是NAME列可能包含的信息类型及其含义的详细解释:
5.3.1. 文件系统中的文件
- 普通文件和目录:对于普通文件和目录,
NAME
列显示的是文件或目录的完整路径,如/home/user/document.txt
或/etc
。
5.3.2. 特殊文件
- 设备文件:如果是字符设备或块设备文件,
NAME
列会显示设备的文件路径,如/dev/tty
(终端设备)或/dev/sda1
(硬盘分区)。 - 管道(Pipe):命名管道通常显示为
pipe:[inode]
,其中[inode]
是管道文件的inode编号。 - Socket:Socket文件会显示协议类型和网络连接的详细信息。例如,
TCP
、UDP
连接会显示本地和远程的地址及端口号,格式类似于[local address]:[local port]->[remote address]:[remote port]
(对于TCP)或[local address]:[local port]
(对于UDP)。Unix域Socket则显示为[类型]:[inode]
,类型通常是STREAM
、DGRAM
等。
5.3.3. 网络连接
- IPv4/IPv6连接:对于网络Socket,
NAME
列提供了连接的详细信息,包括协议类型(如TCP或UDP)、本地地址和端口号、远程地址和端口号(如果可用),以及连接的状态(如LISTEN、ESTABLISHED)。格式示例:TCP localhost:ssh->192.168.1.5:53722 (ESTABLISHED)
。
5.3.4. 内存映射文件
- 内存映射区域:如果文件被映射到进程的内存空间(如共享库或执行文件的代码段),
NAME
列通常会显示文件的路径。对于匿名映射(不直接关联到文件系统中的文件),可能显示为[ anon ]
或特定的标记(如[ stack ]
表示进程的栈空间)。
5.3.5. 示例
让我们通过一些示例来进一步理解NAME
列的含义:
/usr/lib/x86_64-linux-gnu/libc-2.31.so
:表示libc
库文件被打开。TCP 127.0.0.1:4567->127.0.0.1:80 (ESTABLISHED)
:表示有一个TCP连接从本地的4567端口连接到本地的80端口,并且该连接已经建立。pipe:[45678]
:表示一个命名管道被打开,其inode编号为45678。anon_inode:[eventfd]
:表示一个匿名inode关联的特殊文件被打开,通常用于事件通知。
理解lsof
输出中的NAME
列对于诊断系统问题、监控资源使用情况和性能优化非常有帮助。它提供了关于文件和网络资源使用情况的直观视图,帮助你快速定位问题。
5.4. 示例
让我们通过一个具体的lsof
命令执行结果的例子,来深入理解每一列的含义以及每行代表的信息。这里假设我们执行了一个列出特定进程打开的文件的lsof
命令。
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1234 root cwd DIR 253,0 4096 2 /
sshd 1234 root txt REG 253,0 881736 201 /usr/sbin/sshd
sshd 1234 root 0u IPv4 28991 0t0 TCP *:ssh (LISTEN)
解释如下:
-
第一行(
sshd
进程的当前工作目录)COMMAND
:sshd
,表示执行此操作的进程是SSH守护进程。PID
:1234
,进程ID。USER
:root
,表示运行此进程的用户是root。FD
:cwd
,表示当前工作目录。TYPE
:DIR
,指示打开的是一个目录。DEVICE
:253,0
,表示设备号。SIZE/OFF
:4096
,目录的大小。NODE
:2
,文件系统中的inode编号。NAME
:/
,当前工作目录的路径,根目录。
-
第二行(
sshd
进程的可执行文件)COMMAND
: 同上,sshd
。PID
,USER
,DEVICE
: 同上。FD
:txt
,表示此文件是程序的文本(代码和数据)。TYPE
:REG
,常规文件。SIZE/OFF
:881736
,文件大小。NODE
:201
,文件的inode编号。NAME
:/usr/sbin/sshd
,sshd
守护进程的可执行文件路径。
-
第三行(
sshd
进程监听的Socket)COMMAND
: 同上。PID
,USER
: 同上。FD
:0u
,数字表示文件描述符,u
表示以读写模式打开。TYPE
:IPv4
,表示这是一个IPv4网络连接。DEVICE
:28991
,Socket的内部标识。SIZE/OFF
:0t0
,对于Socket而言,此列通常不适用。NODE
: 不适用于网络连接。NAME
:*:ssh (LISTEN)
,表示这个进程正在所有接口的22端口(SSH)上监听入站连接。
6. 使用lsof的注意事项 🚨
- 权限:运行
lsof
可能需要超级用户权限,特别是当你尝试查看其他用户进程打开的文件时。 - 性能:
lsof
可能需要一些时间来生成报告,特别是在系统打开了大量文件的情况下。使用-n
和-P
参数可以减少DNS和服务名解析的开销,加快命令执行速度。 - 输出过滤:
lsof
的输出可能非常庞大,可以使用管道(|
)和grep
来过滤感兴趣的信息。 - 安全性:在多用户环境中使用
lsof
时要注意隐私和安全性,不要泄露敏感信息。
7. 总结 🌈
lsof
是Linux系统管理员和开发人员手中的一把利剑,帮助他们诊断问题、监控系统状态。掌握lsof
的使用方法和它的参数对于深入理解系统的运行机制至关重要。通过实际的命令使用实例和对输出的解读,我们可以更好地管理系统资源,优化应用性能,甚至在复杂的故障排除过程中找到问题的根源。
lsof
不仅仅是一个单一的工具,它是一个功能强大的工具箱,通过其提供的丰富参数和选项,几乎可以洞察Linux操作系统中所有与文件相关的活动。无论是简单地查看哪个进程占用了某个端口,还是深入分析系统中的网络连接和文件使用情况,lsof
都能提供必要的帮助。
相关文章:
深入探索Linux的lsof命令
在Linux系统中,了解哪些文件被哪些进程打开对于系统管理和问题诊断是极其重要的。这正是lsof命令,即List Open Files,发挥其强大功能的场景。本文旨在详细介绍lsof的起源、底层原理、参数意义,常见用法,并详解其返回结…...
flowable 想改变正在运行的任务,实例版本为最新,需要改哪些表
在Flowable中,要改变正在运行的任务,你需要更新相关的流程定义,具体来说,可能涉及到以下几张表: ACT_RU_TASK(运行时任务):这张表包含了当前正在运行的任务信息。你可能需要更新该表…...
统计各位数字都不同的数字个数 II
3032. 统计各位数字都不同的数字个数 II 给你两个 正整数 a 和 b ,返回 闭区间 [a, b] 内各位数字都不同的数字个数。 示例 1: 输入:a 1, b 20 输出:19 解释:除 11 以外,区间 [1, 20] 内的所有数字的各…...

Taro框架中的H5 模板基本搭建
1.H5 模板框架的搭建 一个h5 的基本框架的搭建 基础template 阿乐/H5 Taro 的基础模板...
gitea详细介绍
Gitea 是一个轻量级、易于安装的 Git 服务,提供了类似于 GitHub 的功能,如代码托管、问题追踪、团队合作等。它使用 Go 语言开发,可以在自己的服务器上进行部署,从而实现自托管的 Git 服务。Gitea 具有用户友好的界面,…...
应用性能分析系统SkyWalking的安装及使用详解
1. 前言 本文全面介绍了Skywalking的功能特点、安装步骤以及使用方法。首先,文章详细阐述了Skywalking作为一款开源的应用性能管理系统(APM)的核心功能,包括分布式追踪、服务网格观测分析、度量聚合和可视化一体化等。接着,文章提供了Skywalking的详细安装指南,包括环境…...

服务器远程桌面连接不上怎么办?
随着互联网的发展和远程办公的兴起,服务器远程桌面连接成为了许多企业和个人不可或缺的工具。偶尔我们可能会碰到服务器远程桌面连接不上的情况,这时候我们需要找到解决办法,确保高效地远程访问服务器。 天联组网——突破远程连接障碍 在我们…...
C++之STL的algorithm(8)之适配器(bind等)整理
C之STL的algorithm(8)之适配器(bind等)整理 注:整理一些突然学到的C知识,随时mark一下 例如:忘记的关键字用法,新关键字,新数据结构 C 的适配器整理 C之STL的algorithm&…...
部分国企笔试总结
2024.3.30相城区某国企笔试 客观题,30分 类似考公行测题(大部分)部分计算机专业基础知识(仅几题) 主观题,70分 网络安全类一道C编程题:用户输入圆半径r,程序计算面积和周长并输出…...

《QT实用小工具·二十二》多种样式导航按钮控件
1、概述 源码放在文章末尾 该项目实现了多种样式的导航按钮控件 可设置文字的左侧、右侧、顶部、底部间隔。 可设置文字对齐方式。 可设置显示倒三角、倒三角边长、倒三角位置、倒三角颜色。 可设置显示图标、图标间隔、图标尺寸、正常状态图标、悬停状态图标、选中状态图标…...

不定长顺序表
一.不定长顺序表的结构: typedef struct DSQList{ int* elem;//动态内存的地址 int length;//有效数据的个数 int listsize;//总容量 }DSQList,*DPSQList; 很明显,为了能实现扩容(否则如何实现再次判满呢?),我们必须要在定长顺序表的基础上增加一个总容量;结构示意图如下: 二…...

5.网络编程-socker(golang版)
目录 一、什么是socket? 二、Golang中使用TCP TCP服务端 TCP客户端 三、TCP黏包,拆包 1.什么是粘包,拆包? 2.为什么UDP没有粘包,拆包? 3.粘包拆包发生场景 4.TCP黏包 黏包服务端 …...

网格矢量如何计算莫兰指数
网格矢量如何计算莫兰指数 引言 遇到一个问题,计算矢量网格的莫兰指数。 概念解释 莫兰指数 莫兰指数(Moran’s Index)是一种空间自相关指标,用于衡量空间数据的相似性和聚集程度。它可以用来描述一个区域与其邻近区域之间的属…...

《containerd原理剖析与实战》大模型时代下如何学习云原生
大模型与云原生 近年来,大语言模型的热度可谓是愈发高涨,尤其是今年年初 Sora 的出现,更是让全球再次看到了AIGC 的巨大威力。 Sora 生成实例视频---几头巨大的长毛猛犸踏着积雪的草地而来 在当前大模型流行的时代下,云原生技术…...

【实用工具】使用飞书机器人监控工程日志
1.创建一个飞书群聊,设置-->群机器人-->添加机器人-->自定义机器人-->修改机器人名称-->添加 2.复制webhook地址 3.编写日志请求代码 import logging import requests import json import os from datetime import datetime import time import sub…...

NIKKE胜利女神PC怎么设置中文 手把手教你设置中文教程
这个游戏中的妮姬分四个企业,其中朝圣者这个派别的妮姬很少而且不在愿望单理,朝圣者的所有姐姐都很哇塞,红莲更是其中的大姐大。一般想抽朝圣者只能靠歪或者出限定卡池,举个栗子,我入坑的时候 朝圣者 神罚 是限定卡池&…...
【leetcode面试经典150题】2.移除元素(C++)
【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主,题解使用C语言。(若有使用其他语言的同学也可了解题解思路,本质上语法内容一致&…...

实现几何对象按照一定距离向外缓冲
1、首先,确保你已经引入了Turf.js库。你可以通过在HTML文件中添加以下代码来引入 <script src"https://cdn.jsdelivr.net/npm/turf/turf6.5.0/turf.min.js"></script>2、使用turf.buffer实现几何对象按照设定距离扩充 let originalCoordinat…...

现代深度学习模型和技术
Transformer模型的理解和应用 Transformer模型自2017年由Vaswani等人在论文《Attention is All You Need》中提出以来,已经彻底改变了自然语言处理(NLP)领域的面貌。Transformer的核心是自注意力(Self-Attention)机制…...

go的orm框架-Gorm
官网文档 特点 全功能 ORM 关联 (拥有一个,拥有多个,属于,多对多,多态,单表继承) Create,Save,Update,Delete,Find 中钩子方法 支持 Preload、Joins 的预加载 事务&…...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...