#sockets #systemd #listenfd #cargo-watch #env-var #socket-activation

app systemfd

一个方便的助手,用于将套接字传递到另一个进程。最好与listenfd和cargo-watch结合使用。

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日

#315Unix API

Download history 119/week @ 2024-03-11 69/week @ 2024-03-18 85/week @ 2024-03-25 127/week @ 2024-04-01 70/week @ 2024-04-08 99/week @ 2024-04-15 84/week @ 2024-04-22 81/week @ 2024-04-29 40/week @ 2024-05-06 49/week @ 2024-05-13 57/week @ 2024-05-20 70/week @ 2024-05-27 81/week @ 2024-06-03 96/week @ 2024-06-10 50/week @ 2024-06-17 45/week @ 2024-06-24

每月279次 下载

Apache-2.0

24KB
477 代码行

systemfd

Build Status Crates.io License rustc 1.46.0 Documentation

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 默认为 tcpunix 取决于值。以下类型存在

  • 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