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

简介: 【一起学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库来管理系统的服务,他将成为你后续开发中非常好用的一个工具。

目录
相关文章
|
7月前
|
Rust 安全 开发者
Rust之旅:打造并发布你的首个Rust库
本文将引导读者走进Rust的世界,从基础概念讲起,逐步深入到如何创建、测试、打包和发布自己的Rust库。通过实际操作,我们将理解Rust的独特之处,并学会如何分享自己的代码到Rust社区,从而为开源世界做出贡献。
|
7月前
|
存储 JSON Rust
【一起学Rust | 进阶篇 | reqwest库】纯 Rust 编写的 HTTP 客户端——reqwest
【一起学Rust | 进阶篇 | reqwest库】纯 Rust 编写的 HTTP 客户端——reqwest
1389 0
|
7月前
|
存储 Rust 自然语言处理
【一起学Rust | 进阶篇 | thesaurus-rs库】Rust 的离线同义词库——thesaurus-rs
【一起学Rust | 进阶篇 | thesaurus-rs库】Rust 的离线同义词库——thesaurus-rs
70 0
|
2月前
|
Rust 监控 编译器
解密 Python 如何调用 Rust 编译生成的动态链接库(一)
解密 Python 如何调用 Rust 编译生成的动态链接库(一)
55 2
|
2月前
|
Rust 安全 Python
解密 Python 如何调用 Rust 编译生成的动态链接库(二)
解密 Python 如何调用 Rust 编译生成的动态链接库(二)
44 1
|
4月前
|
Rust 搜索推荐 算法
Massa用到的主流Rust库列表
这篇文章展示了Massa项目在构建和运行时所依赖的一系列Rust库。这些库包括但不限于用于WebAssembly的`wasmer`,用于异步编程的`tokio`,用于处理日期和时间的`chrono`,以及用于加密的`aes-gcm`等。特别提到了`zstd-sys`这个库的版本`v2.0.8+zstd.1.5.5`,用于Zstandard压缩算法。文章还列出了其他多个库的版本信息,反映了Massa项目在Rust生态系统中的技术栈。
40 3
|
7月前
|
存储 Rust 安全
Rust标准库概览:集合、IO、时间与更多
本文将带领读者深入了解Rust标准库中的一些核心模块,包括集合类型、输入/输出处理、时间日期功能等。我们将通过实例和解释,探讨这些模块如何使Rust成为高效且安全的系统编程语言。
|
7月前
|
Rust JavaScript 前端开发
【一起学Rust | 框架篇 | iced框架】rust原生跨平台GUI框架——iced
【一起学Rust | 框架篇 | iced框架】rust原生跨平台GUI框架——iced
826 0
|
7月前
|
Rust Java Linux
【一起学Rust | 进阶篇 | jni库】JNI实现Java与Rust进行交互
【一起学Rust | 进阶篇 | jni库】JNI实现Java与Rust进行交互
230 0
|
1月前
|
Rust 安全 Java
探索Rust语言的并发编程模型
探索Rust语言的并发编程模型