Why a scheduled job needs two files
A systemd timer never contains the command. The .timer unit holds only the schedule, and it activates a service of the same base name when that schedule fires. The work lives in the .service unit, which uses Type=oneshot because the command runs to completion instead of staying in the foreground.
That split is why the timer carries [Install] with WantedBy=timers.target and the service carries no [Install] section at all. You enable the timer; the timer starts the service. Running systemctl enable on the service would be wrong, and without an [Install] section it simply fails with a clear message rather than creating a job that runs at every boot.
- A .timer unit with OnCalendar or OnBootSec and OnUnitActiveSec
- Persistent, RandomizedDelaySec, and AccuracySec when you set them
- WantedBy=timers.target so the timer starts at boot
- A Type=oneshot service with the command, account, and working directory
- Quoted Environment lines and an optional EnvironmentFile path
- Sandboxing directives, with no [Install] section on the service