Skip to main content

Systemd Services

The agent runs as a collection of systemd services. Each service handles one responsibility: MAVLink, video, cloud, health, and so on. The supervisor (ados-supervisor, a native Rust orchestrator) manages the lifecycle of all child services through systemctl. The unit names are a stable interface: you type the same systemctl restart ados-<name> commands regardless of which language a unit runs. Most units now exec a native Rust binary; a few stay Python by design (AI and vision, hardware-detection and bootstrap glue, the residual API, and some ground-station hardware managers). The “Runs” and “Lang” columns below show which is which. This architecture gives you per-service restart, resource isolation via cgroups, and clean dependency ordering.

Service list

Core services (all profiles)

Drone profile services

Ground station services (ground_station profile only)

Startup order

The supervisor starts first and brings up child services in dependency order:
Hardware-dependent services (video, wfb, modem) only start when the relevant hardware is detected.

Resource limits

Each service runs with cgroup resource limits to prevent any single service from consuming all system resources:
Memory caps configured on a representative drone profile: This leaves headroom for the OS, ffmpeg, and MediaMTX.

Circuit breaker

The supervisor implements a circuit breaker: if a service fails 5 times within 60 seconds, the circuit breaker opens and stops restarting it. This prevents crash loops from consuming all system resources. The circuit breaker state is visible through the REST API:

Managing services

Check service status

Restart a service

View service logs

Stop everything

This stops the supervisor and all child services.

Start everything

Service dependencies

Ground station services have explicit dependency ordering:
This ensures the WiFi hotspot is up before the uplink router starts, and the video relay is ready before the kiosk opens the HUD page.

Automatic restart

All services are configured with automatic restart on failure:
The supervisor detects when a child service restarts and logs the event. Combined with the circuit breaker, this means transient failures self-heal while persistent failures are contained.

Viewing all service files

The systemd unit files are installed at:
To see the contents of a specific service file:
Do not edit the service files directly. They are overwritten on each upgrade. If you need to customize a service (e.g., add environment variables or change resource limits), use a systemd override:
This creates a drop-in override file that persists across upgrades.