前言
Service Manager是一个rust的专用跨平台服务管理库。它为rust程序提供了服务管理功能,现在它支持下列服务管理平台的操作接口
sc.exe
WindowsLaunchd
Mac OSsystemd
LinuxOpenRC
Linuxrc.d
FreeBSD
一、安装
在Cargo.toml中添加依赖
service-manager = "0.1"
二、使用例程
通用服务管理
这个 crate 提供了一种机制来检测和使用当前操作系统的默认服务管理平台。每个Service Manager
实例提供四种关键方法:
install
- 安装服务uninstall
- 卸载服务start
- 启动服务stop
- 停止服务
use service_manager::*; use std::{ffi::OsString, path::PathBuf}; fn main(){ // 为服务创建一个标签 let label: ServiceLabel = "com.example.my-service".parse().unwrap(); // 通过检测平台上的可用内容获取通用服务 let manager = <dyn ServiceManager>::native() .expect("Failed to detect management platform"); // 使用底层服务管理平台安装我们的服务 manager.install(ServiceInstallCtx { label: label.clone(), program: PathBuf::from("path/to/my-service-executable"), args: vec![OsString::from("--some-arg")], }).expect("Failed to install"); // 使用底层服务管理平台启动我们的服务 manager.start(ServiceStartCtx { label: label.clone() }).expect("Failed to start"); // 使用底层服务管理平台停止我们的服务 manager.stop(ServiceStopCtx { label: label.clone() }).expect("Failed to stop"); // 使用底层服务管理平台卸载我们的服务 manager.uninstall(ServiceUninstallCtx { label: label.clone() }).expect("Failed to stop");}
用户级服务管理
默认情况下,服务管理平台会与系统级服务交互;但是,一些服务管理平台喜欢systemd并 launchd支持用户级服务。要在用户级别与服务交互,您可以使用通用 ServiceManager::set_level功能配置您的管理器。
use service_manager::*; // 创建服务标签 let label: ServiceLabel = "com.example.my-service".parse().unwrap(); // 获取服务 let mut manager = <dyn ServiceManager>::native() .expect("Failed to detect management platform"); // 设定用户级服务 manager.set_level(ServiceLevel::User) .expect("Service manager does not support user-level services"); // 其他操作 // ...
特定服务管理
有时您需要对绑定到特定平台的服务的配置进行更多控制。为此,您可以显式创建服务管理器并适当地设置配置属性。
use service_manager::*; // 创建服务标签 let label: ServiceLabel = "com.example.my-service".parse().unwrap(); // 实例化特定的服务管理器 let mut manager = LaunchdServiceManager::system(); // 更新安装服务时的安装配置属性 // 将不会添加 KeepAlive 标志 manager.config.install.keep_alive = false; // 使用指定的服务器管理器安装服务 manager.install(ServiceInstallCtx { label: label.clone(), program: PathBuf::from("path/to/my-service-executable"), args: vec![OsString::from("--some-arg")], }).expect("Failed to install");
总结
以上就是本文的所有内容。本期学习了在Windows平台和Linux平台中,通过 Service Manager库来管理系统的服务,他将成为你后续开发中非常好用的一个工具。