Systemd

一个简单的 Swift 库,用于在 Linux 上与 systemd 交互。

兼容性

此库被设计为在非 Linux 平台(如 macOS)上 API 兼容,因此如果应用程序使用此软件包,它仍然可以在非 Linux 平台上编译和运行。但是,systemd 特定的调用将不起作用。例如,SystemdHelpers.isSystemdService 在 Windows 或 macOS 上将始终返回 false

但是,要在 Linux 中使用此库,需要 systemd 库。可以使用以下命令在不同的发行版上安装这些库

对于其他发行版,请在软件包仓库中查找 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)

Systemd 生命周期

此仓库还包含一个单独的 SystemdLifecycle 产品,可供使用 swift-service-lifecycle 库来运行和管理应用程序服务的项目使用。它是一个简单的服务,可从服务的 run() 方法发送上面的 READY=1STOPPING=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 不依赖于任何其他服务,因此可以在应用程序服务生命周期的任何时候构建和启动它。