#!/bin/sh
# Run a command repeatedly without depending on systemd timers or cron.

set -u

interval=7200
delay=0

usage() {
    echo "usage: $0 [--delay SECONDS] [--interval SECONDS] -- command [args...]" >&2
    exit 64
}

while [ "$#" -gt 0 ]; do
    case "$1" in
        --delay)
            [ "$#" -ge 2 ] || usage
            delay=$2
            shift 2
            ;;
        --interval)
            [ "$#" -ge 2 ] || usage
            interval=$2
            shift 2
            ;;
        --)
            shift
            break
            ;;
        *) usage ;;
    esac
done

[ "$#" -gt 0 ] || usage

case "$delay:$interval" in
    *[!0-9:]*|:*|*:0) usage ;;
esac

running=1
child=""

terminate() {
    running=0
    if [ -n "$child" ]; then
        kill "$child" 2>/dev/null || true
    fi
}

trap terminate INT TERM HUP

sleep_interruptible() {
    seconds=$1
    [ "$seconds" -eq 0 ] && return 0
    sleep "$seconds" &
    child=$!
    wait "$child" 2>/dev/null || true
    child=""
}

sleep_interruptible "$delay"

while [ "$running" -eq 1 ]; do
    "$@" || true
    [ "$running" -eq 1 ] || break
    sleep_interruptible "$interval"
done

exit 0
