当我运行时netstat -nptl
,我有这个奇怪的输出:
tcp 0 0 127.0.2.1:53 0.0.0.0:* LISTEN 1/init
这是来自dnscrypt-proxy
DoH 服务的默认配置。
ps uww 1
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.1 0.0 166580 11936 ? Ss 12:15 0:01 /sbin/init splash
我想知道为什么 PID 1 现在没有意义了
答案1
在 Linux 上 usingnetstat
应替换为 using ss
,因为它提供了更多信息。对于这种情况,它提供了全部共享套接字的进程,同时netstat
在第一个进程停止。还有其他细微差别,例如提供comm
名称 ( systemd
) 而不是cmd
名称 ( init
)。这里是 Debian 12,但任何基于 systemd 的 Linux 系统都会类似:
# netstat -tnlp | awk 'NR <=2 || /127.0.2.1:/'
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.2.1:53 0.0.0.0:* LISTEN 1/init
# ss -nptl src 127.0.2.1
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 4096 127.0.2.1:53 0.0.0.0:* users:(("dnscrypt-proxy",pid=6245,fd=8),("systemd",pid=1,fd=49))
可以看到两者systemd
共享dnscrypt-proxy
同一个套接字。
为什么?因为dnscrypt-proxy
虽然正在运行系统的插座 激活: 类似的机制内网但经过改进,允许(如果如此配置)在守护进程实际运行之前进行套接字侦听,准备在第一次调用时启动守护进程。当一个系统 服务配置有一个关联的系统 套接字配置(具有足够的依赖性,此处Requires=dnscrypt-proxy.socket
),这意味着它正在使用套接字激活。
# systemctl status dnscrypt-proxy.socket
* dnscrypt-proxy.socket - dnscrypt-proxy listening socket
Loaded: loaded (/lib/systemd/system/dnscrypt-proxy.socket; enabled; preset: enabled)
Active: active (running) since Tue 2024-01-09 18:16:11 UTC; 23min ago
Triggers: * dnscrypt-proxy.service
Docs: https://github.com/DNSCrypt/dnscrypt-proxy/wiki
Listen: 127.0.2.1:53 (Stream)
127.0.2.1:53 (Datagram)
Tasks: 0 (limit: 18402)
Memory: 12.0K
CPU: 1ms
CGroup: /system.slice/dnscrypt-proxy.socket
[...]
# systemctl status dnscrypt-proxy.service
* dnscrypt-proxy.service - DNSCrypt client proxy
Loaded: loaded (/lib/systemd/system/dnscrypt-proxy.service; enabled; preset: enabled)
Active: active (running) since Tue 2024-01-09 18:38:54 UTC; 1min 20s ago
TriggeredBy: * dnscrypt-proxy.socket
Docs: https://github.com/DNSCrypt/dnscrypt-proxy/wiki
Main PID: 6245 (dnscrypt-proxy)
Tasks: 12 (limit: 18402)
Memory: 10.6M
CPU: 60ms
CGroup: /system.slice/dnscrypt-proxy.service
`-6245 /usr/sbin/dnscrypt-proxy -config /etc/dnscrypt-proxy/dnscrypt-proxy.toml
[...]
套接字的创建是systemd
通过.socket
与该部分关联的部分直接处理的.service
,然后该侦听套接字被继承dnscrypt-proxy
(必须知道此方法)。
这种方法有多种优点,其中至少有这两个(其他的在插座 激活链接):
- 即使在启动时,守护进程也不必以任何权限运行来打开特权端口
- 守护进程可以选择在一段时间不活动后停止,从而释放系统资源。系统如果收到新的查询,将重新启动它,同时系统不会拒绝连接。