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:Resource limits
Each service runs with cgroup resource limits to prevent any single service from consuming all system resources:
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
Start everything
Service dependencies
Ground station services have explicit dependency ordering:Automatic restart
All services are configured with automatic restart on failure:Viewing all service files
The systemd unit files are installed at: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.