Thanks to visit codestin.com
Credit goes to lib.rs

16 unstable releases (5 breaking)

0.5.0 Jun 26, 2025
0.4.0 Sep 26, 2024
0.3.1 Oct 5, 2023
0.3.0 Jul 23, 2023
0.1.7 Jul 1, 2022

#345 in Encoding

Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App

14,512 downloads per month
Used in 5 crates (4 directly)

MIT/Apache

57KB
1.5K SLoC

systemctl

Small rust crate to interact with systemd units through systemctl.

At the time I needed those features, I was not aware of zbus-systemd, which is now available and should be prefered.
This crate uses systemctl interaction directly, which is far from ideal for applications. zbus-systemd should therefore be prefered.

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

Features

  • serde: Enable to make structs in this crate De-/Serializable

Limitations

Currently, systemd Version <245 are not supported as unit-file-list changed from two column to three column setup. See: systemd Changelog

Unit / service operation

Nominal service operations:

let systemctl = systemctl::SystemCtl::default();
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();
}

Service enumeration

let systemctl = systemctl::SystemCtl::default();
// 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*"));

// Check if a unit is active
systemctl.get_active_state("service");

// list dependencies of a service or target
systemctl.list_dependencies("some.target");

Unit structure

Use the unit structure for more information

let systemctl = systemctl::SystemCtl::default();
let unit = systemctl.create_unit("ssh.service")
    .unwrap();
systemctl.restart(&unit.name).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);
println!("Memory consumption: {:?}", unit.memory);

TODO

  • parse all known attributes in from_systemctl

Dependencies

~1–1.7MB
~34K SLoC