一个简单的 Swift 库,用于在 Linux 上与 systemd 交互。
此库被设计为在非 Linux 平台(如 macOS)上 API 兼容,因此如果应用程序使用此软件包,它仍然可以在非 Linux 平台上编译和运行。但是,systemd 特定的调用将不起作用。例如,SystemdHelpers.isSystemdService
在 Windows 或 macOS 上将始终返回 false
。
但是,要在 Linux 中使用此库,需要 systemd
库。可以使用以下命令在不同的发行版上安装这些库
sudo apt install libsystemd-dev
sudo dnf install systemd-devel
sudo zypper install systemd-devel
对于其他发行版,请在软件包仓库中查找 systemd dev 包并安装它。
注意:此库不兼容 Musl,因为 systemd 库似乎仍然尚未完全移植到 Musl。如果这种情况发生变化,请提交工单,以便在支持此配置后可以添加对 Musl 的支持。
将以下依赖项添加到您的 Package.swift
文件中
.package(url: "https://github.com/xtremekforever/swift-systemd.git", from: "0.1.0")
然后,像这样将其添加到您的目标 dependencies
部分
.product(name: "Systemd", package: "swift-systemd")
以下面的 systemd 服务文件为例
[Unit]
Description=My Systemd Service
[Service]
Type=notify
WorkingDirectory=/usr/local/bin
ExecStart=/usr/local/bin/MyService
WatchdogSec=30
[Install]
WantedBy=multi-user.target
首先,将 import Systemd
添加到应用程序,以使用此库提供的模块。
要查看应用程序是否在 systemd 下运行,请使用 SystemdHelpers
接口
if SystemdHelpers.isSystemdService {
print("This app is running as a systemd service!")
// do things like modify logging format (if using swift-log) or whatever else is needed.
}
要向 systemd 发送有关应用程序状态的信号,请使用 SystemdNotifier
接口
let notifier = SystemdNotifier()
// Call after starting up app (sends READY=1)
notifier.notify(ServiceState.Ready)
// Call before exiting app (sends STOPPING=1)
notifier.notify(ServiceState.Stopping)
此仓库还包含一个单独的 SystemdLifecycle
产品,可供使用 swift-service-lifecycle 库来运行和管理应用程序服务的项目使用。它是一个简单的服务,可从服务的 run()
方法发送上面的 READY=1
和 STOPPING=1
信号。
可以通过像这样添加 SystemdLifecycle
目标 dependencies
部分来使用它
.product(name: "SystemdLifecycle", package: "swift-systemd")
然后,一旦使用 import SystemdLifecycle
导入产品,就可以将其添加到 ServiceGroup
中
let serviceGroup = ServiceGroup(
configuration: .init(
services: [
.init(service: SystemdService())
]
)
)
try await serviceGroup.run()
SystemdService
不依赖于任何其他服务,因此可以在应用程序服务生命周期的任何时候构建和启动它。