69 lines
1.1 KiB
Bash
69 lines
1.1 KiB
Bash
#!/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
|