【一起学Rust | 进阶篇 | Service Manager库】Rust专用跨平台服务管理库

【一起学Rust | 进阶篇 | Service Manager库】Rust专用跨平台服务管理库ServiceManager是一个rust的专用跨平台服务管理库。它为rust程序提供了服务管理功能,现在它支持下列服务管理平台的操作接口sc.exeWindowsLaunchdMacOSsystemdLinuxOpenRCLinuxrc.dFreeBSD以上就是本文的所有内容。本期学习了在Windows平台和Linux平台中,通过ServiceManager库来管理系统的服务,他将成为你后续开发中非常好用的一个工具。…

【一起学Rust | 进阶篇 | Service Manager库】Rust专用跨平台服务管理库


前言

Service Manager是一个rust的专用跨平台服务管理库。它为rust程序提供了服务管理功能,现在它支持下列服务管理平台的操作接口

  1. sc.exe Windows
  2. Launchd Mac OS
  3. systemd Linux
  4. OpenRC Linux
  5. rc.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库来管理系统的服务,他将成为你后续开发中非常好用的一个工具。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:http://bianchenghao.cn/37049.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注