#!/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