Socket 激活把监听器交给兼容的服务
Socket 激活让 systemd 在应用进程启动之前先打开监听端点。端点上的活动随后可以触发兼容服务,并把管理器已经持有的套接字描述符传给它。这里真正分开的,是监听器所有权与应用生命周期。端点已经开放,还不证明应用完成初始化、接受了请求或生成了正确响应;传输层能连接与业务层能工作,需要分别验证。 socket 单元先活动,对应服务的 MainPID 为 0。首个连接触发工作进程,它校验 LISTEN_PID、LISTEN_FDS 1 及监听中的 FD 3,处理有完整边界的请求并回复。工作进程主动退出,管理器保留监听器;后续连接启动不同的进程,仍使用 FD 3。重复绑定会得到 EADDRINUSE。停止 socket 后移除路径,是因为本例明确配置了 RemoveOnStop=yes。 仅示意选定的原文机制;本轮没有执行示例。 坏掉的样子 应用必须理解激活协议。如果守护进程无条件再次绑定同一个端点,就可能因为管理器已经占用而失败。激活机制把绑定责任移到 socket 单元,并不会消除地址冲突、接口缺失、文件系统权限错误,或其他导致首次绑定失败的条件。因此不能把“端口先开好”写成所有启动竞态已经自动消失,真正的监听建立仍然可能失败。 使用 Accept=no 时,服务接收监听套接字并自行接受连接;Accept=yes 则为合适的流套接字支持按连接启动服务实例的模式。它们对应不同的应用契约,不能互换。任何一种模式都不意味着任意守护进程会自动判断空闲、完成工作后退出,或者只在安全时重新启动。是否退出,以及退出时哪些请求已经完成,仍然由应用行为决定。 ...