#操作系统 #服务 #管理器 #生成器 #FreeBSD #接口 #管理

service-manager

提供与各种操作系统服务管理器通信的适配器

14 个版本 (6 个破坏性更新)

0.7.1 2024 年 7 月 13 日
0.6.2 2024 年 5 月 27 日
0.6.0 2024 年 2 月 18 日
0.5.1 2023 年 11 月 22 日
0.1.3 2022 年 7 月 25 日

#12 in 配置

Download history 2437/week @ 2024-05-04 2884/week @ 2024-05-11 3593/week @ 2024-05-18 2394/week @ 2024-05-25 4652/week @ 2024-06-01 2291/week @ 2024-06-08 1652/week @ 2024-06-15 1485/week @ 2024-06-22 1426/week @ 2024-06-29 2240/week @ 2024-07-06 2198/week @ 2024-07-13 2522/week @ 2024-07-20 2662/week @ 2024-07-27 2516/week @ 2024-08-03 1554/week @ 2024-08-10 1724/week @ 2024-08-17

8,926 每月下载量
10 个 Crates 中使用 (6 个直接使用)

MIT/Apache

100KB
2.5K SLoC

服务管理器

Crates.io Docs CI

Rust 库,提供与以下服务管理平台交互的接口

需要 Rust 1.58.1 或更高版本!

安装

将以下内容添加到您的 Cargo.toml

[dependencies]
service-manager = "0.7"

示例

通用服务管理

此 crate 提供了一种机制来检测并使用当前操作系统的默认服务管理平台。每个 ServiceManager 实例提供四个关键方法

  • install - 将安装由给定上下文指定的服务
  • uninstall - 将卸载由给定上下文指定的服务
  • start - 将启动由给定上下文指定的已安装服务
  • stop - 将停止由给定上下文指定的运行中的服务
use service_manager::*;
use std::ffi::OsString;
use std::path::PathBuf;

// Create a label for our service
let label: ServiceLabel = "com.example.my-service".parse().unwrap();

// Get generic service by detecting what is available on the platform
let manager = <dyn ServiceManager>::native()
    .expect("Failed to detect management platform");

// Install our service using the underlying service management platform
manager.install(ServiceInstallCtx {
    label: label.clone(),
    program: PathBuf::from("path/to/my-service-executable"),
    args: vec![OsString::from("--some-arg")],
    contents: None, // Optional String for system-specific service content.
    username: None, // Optional String for alternative user to run service.
    working_directory: None, // Optional String for the working directory for the service process.
    environment: None, // Optional list of environment variables to supply the service process.
    autostart: true, // Specify whether the service should automatically start upon OS reboot.
}).expect("Failed to install");

// Start our service using the underlying service management platform
manager.start(ServiceStartCtx {
    label: label.clone()
}).expect("Failed to start");

// Stop our service using the underlying service management platform
manager.stop(ServiceStopCtx {
    label: label.clone()
}).expect("Failed to stop");

// Uninstall our service using the underlying service management platform
manager.uninstall(ServiceUninstallCtx {
    label: label.clone()
}).expect("Failed to stop");

用户级服务管理

默认情况下,服务管理平台将与系统级服务交互;然而,一些服务管理平台(如 systemdlaunchd)支持用户级服务。要与服务在用户级别交互,您可以使用通用 ServiceManager::set_level 函数配置您的管理器。

use service_manager::*;

// Create a label for our service
let label: ServiceLabel = "com.example.my-service".parse().unwrap();

// Get generic service by detecting what is available on the platform
let mut manager = <dyn ServiceManager>::native()
    .expect("Failed to detect management platform");

// Update our manager to work with user-level services
manager.set_level(ServiceLevel::User)
    .expect("Service manager does not support user-level services");

// Continue operating as usual via install/uninstall/start/stop
// ...

特定服务管理器配置

有时候,您需要对特定平台绑定的服务配置进行更多控制。为此,您可以显式创建服务管理器并适当地设置配置属性。

use service_manager::*;
use std::ffi::OsString;
use std::path::PathBuf;

// Create a label for our service
let label: ServiceLabel = "com.example.my-service".parse().unwrap();

// Instantiate a specific service manager
let mut manager = LaunchdServiceManager::system();

// Update an install configuration property where installing a service
// will NOT add the KeepAlive flag
manager.config.install.keep_alive = false;

// Install our service using the explicit service manager
manager.install(ServiceInstallCtx {
    label: label.clone(),
    program: PathBuf::from("path/to/my-service-executable"),
    args: vec![OsString::from("--some-arg")],
    contents: None, // Optional String for system-specific service content.
    username: None, // Optional String for alternative user to run service.
    working_directory: None, // Optional String for the working directory for the service process.
    environment: None, // Optional list of environment variables to supply the service process.
    autostart: true, // Specify whether the service should automatically start upon OS reboot.
}).expect("Failed to install");

运行测试

为了测试目的,我们使用一个名为 system-tests 的单独的包,并根据所需的平台和级别执行单个测试。从存储库的根目录执行以下命令以运行 systemd 用户测试:

cargo test -p system-tests systemd_for_user -- --nocapture

另外,使用以下命令运行 systemd 系统测试(注意使用 sudo -E 以保持系统级别安装所需的权限):

sudo -E cargo test -p system-tests systemd_for_system -- --nocapture

许可协议

该项目可选择以下任一许可协议:

Apache License,版本 2.0,(LICENSE-APACHE 或 apache-license)MIT 许可协议(LICENSE-MIT 或 mit-license)。

依赖项

~5–16MB
~189K SLoC