5个版本 (3个破坏性更新)
0.4.1 | 2023年3月10日 |
---|---|
0.4.0 | 2022年1月16日 |
0.3.0 | 2018年5月20日 |
0.2.0 | 2018年5月17日 |
0.1.0 | 2018年5月17日 |
#315 在 Unix API
每月279次 下载
24KB
477 代码行
systemfd
systemfd
是systemd中1%对开发有用的部分。它是一个小的进程,打开了一组套接字并将它们传递给另一个进程,这样该进程就可以在无需断开连接的情况下重启自己。为此,它在macOS和Linux上使用systemd套接字传递协议(LISTEN_FDS
+ LISTEN_PID
)环境变量,在Windows上使用自定义协议。两个都由 listenfd crate 支持。
与 cargo-watch 结合使用时,您可以得到自动重新加载开发服务器的预览
$ systemfd --no-pid -s http::5000 -- cargo watch -x run
使用 --no-pid
标志禁用在Unix上传递 LISTEN_PID
变量(它在Windows上没有影响)。这使得 listenfd
跳过pid检查,否则会失败。要了解如何实现一个适用于systemfd的服务器,请参见下面的示例。
这个程序受到了 catflap 的启发,但遵循systemd语义并支持多个套接字。
安装
您可以通过使用cargo安装systemfd来获取它
$ cargo install systemfd
用法
systemfd
根据命令行中指定的内容创建一个或多个套接字,然后调用另一个应用程序。每次传递 -s
(或 --socket
)参数时,都会创建一个新的套接字。参数的值是套接字规范,格式为 [TYPE::]VALUE
其中 TYPE
默认为 tcp
或 unix
取决于值。以下类型存在
tcp
:创建一个tcp监听器http
:创建用于http的TCP监听器(在info输出中打印http URL)https
:创建用于https的TCP监听器(在info输出中打印https URL)unix
:创建Unix监听套接字udp
:创建UDP套接字
VALUE
取决于套接字类型。支持以下格式
<port>
:整数端口号,假设主机为127.0.0.1
<host>:<port>
:绑定到特定的网络接口和端口<unix-path>
:请求特定的Unix套接字
示例
$ systemfd -s http::5000 -- my-server-executable
$ systemfd -s http::5000 -s https::5443 -- my-server-executable
$ systemfd -s 5000 -- my-server-executable
$ systemfd -s udp::1567 -- my-game-server-executable
当systemfd
启动时,它会打印出创建的套接字。可以通过传递-q
来禁用此功能。另外,如果端口设置为0
,则会选择一个随机端口。
Windows协议
在Windows上,套接字的传递比在Unix上复杂得多。为了实现这一点,此实用程序实现了自定义套接字传递系统,该系统也由listenfd crate实现。创建套接字时,会启动一个额外的本地RPC服务器,该服务器向其他进程提供套接字的副本。RPC服务器使用TCP,并通过SYSTEMFD_SOCKET_SERVER
环境变量与子进程通信。RPC调用本身由SYSTEMFD_SOCKET_SECRET
密钥保护。
唯一理解的命令是SECRET|PID
,其中包含密钥和进程的PID。服务器以N个WSAPROTOCOL_INFOW
结构体回复。客户端应计算字节数并相应地操作。
此协议目前是一种妥协方案,可能会更改。它仅存在以支持listenfd
crate。
许可和链接
依赖项
~5–14MB
~160K SLoC