#systemd-unit #interact #service #structs #serde #structure

systemctl

一个小型的 crate,用于与 systemd 单元交互

14 个不稳定版本 (3 个破坏性更新)

0.3.1 2023年10月5日
0.3.0 2023年7月23日
0.2.0 2023年7月19日
0.1.9 2022年12月30日
0.1.7 2022年7月1日

#237 in Unix APIs

Download history 1031/week @ 2024-04-27 1103/week @ 2024-05-04 1038/week @ 2024-05-11 884/week @ 2024-05-18 806/week @ 2024-05-25 833/week @ 2024-06-01 535/week @ 2024-06-08 597/week @ 2024-06-15 573/week @ 2024-06-22 597/week @ 2024-06-29 772/week @ 2024-07-06 847/week @ 2024-07-13 572/week @ 2024-07-20 901/week @ 2024-07-27 830/week @ 2024-08-03 826/week @ 2024-08-10

每月下载量:3,384
用于 4 个 crate (3 个直接使用)

MIT/Apache 许可

32KB
572

systemctl

一个小型的 rust crate,用于与 systemd 单元交互

crates.io License License crates.io
Rust crates.io

功能

  • serde:使本 crate 中的结构体可序列化和反序列化

限制

目前不支持 SystemD 版本 <245,因为单元文件列表已从两列布局更改为三列布局。参见:SystemD 更新日志

环境

SYSTEMCTL_PATH 自定义环境变量描述了 systemctl 二进制文件的绝对位置路径,默认情况下,此 crate 使用 /usr/bin/systemctl,但可以进行自定义

SYSTEMCTL_PATH=/home/$me/bin/systemctl cargo build

单元/服务操作

标准服务操作

systemctl::stop("systemd-journald.service")
    .unwrap();
systemctl::restart("systemd-journald.service")
    .unwrap();

if let Ok(true) = systemctl::exists("ntpd") {
    let is_active = systemctl::is_active("ntpd")
        .unwrap();
}

服务枚举

use systemctl;
// list all units
systemctl::list_units(None, None, None);

// list all services 
// by adding a --type filter
systemctl::list_units(Some("service"), None, None);

// list all services currently `enabled` 
// by adding a --state filter
systemctl::list_units(Some("service"), Some("enabled"), None);

// list all services starting with cron
systemctl::list_units(Some("service"), None, Some("cron*"));

单元结构

使用单元结构以获取更多信息

let unit = systemctl::Unit::from_systemctl("sshd")
    .unwrap();
unit.restart().unwrap();
println!("active: {}", unit.active);
println!("preset: {}", unit.preset);

if let Some(docs) = unit.docs { // doc pages available
    for doc in docs {
        if let Some(page) = doc.as_man() {
            // `man` page exists 
        }
        if let Some(url) = doc.as_url() {
            // `url` is indicated
        }
    }
}

println!("auto_start (enabled): {}", unit.auto_start);
println!("config script : {}", unit.script);
println!("pid: {}", unit.pid);
println!("Running task(s): {}", unit.tasks.unwrap());
println!("Memory consumption: {}", unit.memory.unwrap());

待办事项

  • from_systemctl 中解析所有已知属性

依赖关系

~0.8–1.3MB
~28K SLoC