#!/bin/sh # fenris-collect runit run script — periodic NVMe collection scheduler. # # Runit service layout: # /etc/sv/fenris-collect/run — this script (scheduler) # /etc/sv/fenris-collect/log/run — logger to /var/log/fenris-collect/ # /var/service/fenris-collect — symlink to enable # /etc/sv/fenris-collect/down — marker for dormant install # # Guarantees (must match systemd timer semantics): # - Initial 2-minute boot delay (sleep 120 before first collect) # - Completion-relative 5-minute cadence (sleep 300 after collect) # - Bounded execution (timeout 90s on each collect) # - No catch-up (fixed sleep interval, no Persistent=) # - Serialized runs (runsv does not restart until exit) # - Serialized on-demand (flock serializes fenris-collect execution) # # Spec: §8.4, §8.5, §8.6, ADR 0008 set -eu COLLECT_TIMEOUT=90 BOOT_DELAY=120 CADENCE=300 LOCK_FILE=/var/lib/fenris/fenris-collect.lock # Ensure lock directory exists mkdir -p "$(dirname "$LOCK_FILE")" # Initial boot delay: sleep before first collection sleep "$BOOT_DELAY" # Collection loop: collect, then sleep for cadence while true; do flock --nonblock "$LOCK_FILE" \ timeout "$COLLECT_TIMEOUT" nice ionice -c3 \ /usr/libexec/fenris/fenris-collect \ 2>&1 || true sleep "$CADENCE" done