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 配置
8,926 每月下载量
在 10 个 Crates 中使用 (6 个直接使用)
100KB
2.5K SLoC
服务管理器
Rust 库,提供与以下服务管理平台交互的接口
sc.exe
用于 Windows 服务 (Windows)- Winsw (Windows)
- Launchd (MacOS)
- systemd (Linux)
- OpenRC (Linux)
- rc.d (FreeBSD)
需要 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");
用户级服务管理
默认情况下,服务管理平台将与系统级服务交互;然而,一些服务管理平台(如 systemd
和 launchd
)支持用户级服务。要与服务在用户级别交互,您可以使用通用 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