我使用xinetd
并且它适合我的目的。然而我最近发现 systemd 有一个内置的东西叫做“套接字激活”。
这两个看起来非常相似,但 systemd 是“官方的”并且似乎是更好的选择。
但在使用之前,它们真的一样吗?我应该注意哪些差异?
例如,我只想在第一次请求时启动一些 dockerized 服务 - 我的第一个想法是使用 xinetd。但是套接字激活是否更好/更快/更稳定/等等?
答案1
xinetd
单独考虑时,我不认为 systemd 套接字激活明显优于激活;后者也很稳定并且已经存在了更长时间。套接字激活对于服务解耦来说确实很有趣:它允许服务并行启动,即使它们需要通信,并且它允许服务独立重新启动。
如果您有支持 -style 激活的服务xinetd
,则可以将其与套接字激活一起使用:.socket
描述with 的Accept=true
行为方式与 相同xinetd
。您还需要一个.service
文件来描述该服务。 systemd 套接字激活的全部好处需要提供服务的守护进程的支持。看关于该主题的博客文章。
我的建议往往是“如果它没有损坏,就不要修复它”,但如果您想将xinetd
基于 的服务转换为 systemd,这当然是可行的。
答案2
您可以使用xinetd
或systemd
来激活套接字,两者都可以使用。我个人觉得xinetd
更容易使用,因为所有内容都在一个文件中,但也使用过,systemd
因为它更灵活,特别是侦听多个地址和套接字转发到 UNIX 套接字而不仅仅是 IP 套接字。
这里作为一个例子,我用来将 TCP 连接转发到 MySQL 文件套接字:
/etc/systemd/system/mysql-proxy.service
[Unit]
Description=MySql Proxy Service
Requires=mysql-proxy.socket
[Service]
Environment=MYSQL_PROXY_TARGET=/var/run/mysql/mysql.sock
EnvironmentFile=-/etc/sysconfig/mysql-proxy
ExecStart=/usr/lib/systemd/systemd-socket-proxyd ${MYSQL_PROXY_TARGET}
/etc/systemd/system/mysql-proxy.socket
[Unit]
Description=MySql Proxy Socket
[Socket]
ListenStream=192.168.1.1:3306
ListenStream=192.168.2.1:3306
NoDelay=true
FreeBind=true
[Install]
WantedBy=sockets.target
传统的转发需求Accept=true
,systemd
感知进程应该在一个进程中处理多个连接,或者根据需要分叉其他进程。