Docs › systemd timers with RunVouch

systemd timers with RunVouch

A timer that fires a failing service shows up in systemctl --failed and nowhere else. A timer that never fires (unit disabled, machine asleep, Persistent missing) shows up nowhere at all.

How it runs on systemd timers

The timer starts a .service; wrap that service's ExecStart. Works for system units and systemctl --user units.

Store the key

Put RUNVOUCH_KEY=rv_... in a file with mode 600 and reference it with EnvironmentFile=; do not put the key in the unit file itself, which is world-readable.

Wrap the job

# ~/.config/systemd/user/nightly-report.service
[Service]
Type=oneshot
EnvironmentFile=%h/.config/runvouch.env
ExecStart=%h/.local/bin/rv run nightly-report --evidence-file %h/out/report.html -- %h/bin/report.sh

# ~/.config/systemd/user/nightly-report.timer
[Timer]
OnCalendar=*-*-* 02:00
Persistent=true
[Install]
WantedBy=timers.target

rv fails open: if RunVouch is unreachable the job still runs and you get one warning line.

Register the cadence and caps

rv agent nightly-report --cadence 24h --grace 30m --max-runtime 1h --evidence --cap-run-cost 2

Register the agent once, from anywhere with the key. Cadence is what turns a schedule that stopped into an alert; --evidence makes a run without evidence a failure; the caps pause the agent when it overspends.

What goes silent on systemd timers

What RunVouch detects

AlertWhat it means here
MISSEDcadence plus grace passed and no run started
FAILEDnon-zero exit or a reported failure, with the stderr excerpt
NO_EVIDENCEthe run said ok but the file, URL or assertion you required is missing
STALLEDa run started and never ended within max runtime
RETRY_STORMthe same tool called with identical input many times in one run
BUDGET_RUN / BUDGET_DAYcost cap crossed; the agent is paused until you resume it
DRIFTduration or output size far off its 7-run baseline

Need a key? Get a free key · Stuck? contact