Linux (systemd) Adapter
The SystemdAdapter manages daemons as systemd transient units on Linux systems.
Features
- Transient units via
systemd-run(no unit files needed) - User and system mode support
- Signal forwarding via
systemctl kill - Status queries via
systemctl is-active - Journal logging integration
Usage
#![allow(unused)] fn main() { use duende_core::adapters::SystemdAdapter; use duende_core::types::Signal; // User mode (default) - no root required let adapter = SystemdAdapter::new(); // System mode - requires root let adapter = SystemdAdapter::system(); // Spawn daemon as transient unit let handle = adapter.spawn(Box::new(my_daemon)).await?; println!("Unit: {}", handle.systemd_unit().unwrap()); // Check status let status = adapter.status(&handle).await?; // Send signal adapter.signal(&handle, Signal::Term).await?; }
How It Works
- Spawn: Runs
systemd-run --user --unit=duende-<name>-<uuid> <binary> - Signal: Runs
systemctl --user kill --signal=<sig> <unit> - Status: Runs
systemctl --user is-active <unit> - Cleanup: Unit is transient - removed when process exits
Verification
# List duende units
systemctl --user list-units 'duende-*'
# Check specific unit
systemctl --user status duende-my-daemon-abc123
# View logs
journalctl --user -u duende-my-daemon-abc123
mlock Requirements
For swap device daemons (DT-007), grant memory locking capability:
# Via setcap (preferred)
sudo setcap cap_ipc_lock+ep /usr/bin/my-daemon
# Or via systemd unit override
systemctl --user edit duende-my-daemon
# Add:
# [Service]
# AmbientCapabilities=CAP_IPC_LOCK
# LimitMEMLOCK=infinity
Platform Detection
The adapter is automatically selected when:
- Running on Linux
- Not in a container
- systemd is the init system
#![allow(unused)] fn main() { use duende_core::platform::detect_platform; use duende_core::adapters::select_adapter; let platform = detect_platform(); // Returns Platform::Linux let adapter = select_adapter(platform); // Returns SystemdAdapter }
Requirements
- Linux with systemd 232+
systemd-runandsystemctlin PATH- User session (user mode) or root (system mode)