| Crates.io | unitbus |
| lib.rs | unitbus |
| version | 0.1.7 |
| created_at | 2026-01-03 08:39:13.478641+00 |
| updated_at | 2026-01-23 09:06:38.376063+00 |
| description | Rust SDK for Linux systemd: control units/jobs via D-Bus (systemctl-like), run transient tasks, and query journald logs (sdjournal default, optional journalctl JSON). |
| homepage | https://github.com/lvillis/unitbus |
| repository | https://github.com/lvillis/unitbus |
| max_upload_size | |
| id | 2019791 |
| size | 245,702 |
Rust SDK for Linux systemd: control units/jobs over the system D-Bus (systemctl-like), run transient one-shot tasks, and query journald logs (default: pure Rust backend; optional: journalctl --output=json).
Runtime is Linux-only (systemd + system bus required). The crate is designed to compile on other
platforms, but most operations will fail with Error::BackendUnavailable.
config)org.freedesktop.systemd1)rt-async-io (no tokio dependency)rt-tokio (tokio backend)journal-sdjournal)journalctl JSON backend (feature=journal-cli)journalctl may require root or systemd-journal group membership.rt-async-iort-tokio (mutually exclusive with rt-async-io)journal-sdjournal (pure Rust journald backend, no journalctl subprocess)journal-cli (journald via journalctl --output=json)config (systemd config: unit files + drop-ins)tasks (transient tasks via StartTransientUnit)tracing (instrumentation via tracing)observe (watch unit failures via D-Bus signals)blocking (synchronous wrappers, driven by the selected runtime)[dependencies]
unitbus = "0.1"
To use the journalctl backend (JSON):
[dependencies]
unitbus = { version = "0.1", default-features = false, features = ["rt-async-io", "journal-cli"] }
To use tokio runtime (recommended for tokio apps):
[dependencies]
unitbus = { version = "0.1", default-features = false, features = ["rt-tokio", "journal-sdjournal"] }
use unitbus::{UnitBus, UnitStartMode};
async fn restart_nginx() -> Result<(), unitbus::Error> {
let bus = UnitBus::connect_system().await?;
let job = bus.units().restart("nginx", UnitStartMode::Replace).await?;
let outcome = job.wait(std::time::Duration::from_secs(30)).await?;
println!("{outcome:?}");
Ok(())
}
examples/restart_and_wait.rsexamples/fetch_recent_logs.rsexamples/diagnose_on_failure.rsexamples/list_units_and_properties.rsexamples/render_service_unit.rsexamples/run_transient_task.rs (requires --features tasks)examples/observe_unit_failure.rs (requires --features observe)examples/blocking_restart_and_wait.rs (requires --features blocking)