|
| 1 | +#!/usr/bin/env bash |
| 2 | +#================================================================ |
| 3 | +# HEADER |
| 4 | +#================================================================ |
| 5 | +#% SYNOPSIS |
| 6 | +#+ randomize_jobmanager args $(interval in minutes) |
| 7 | +#% |
| 8 | +#% DESCRIPTION |
| 9 | +#% This script sets the cron.d/os2borgerpc_jobmanager job to execute |
| 10 | +#% at a random startup time with a certain interval. |
| 11 | +#% So if the interval is 5 minutes, the jobmanager could run at |
| 12 | +#% 1, 6, 11...56 every hour, instead of 0, 5, 10 ...55. |
| 13 | +#% |
| 14 | +#================================================================ |
| 15 | +#- IMPLEMENTATION |
| 16 | +#- version randomize_jobmanager (magenta.dk) 0.0.1 |
| 17 | +#- author Danni Als |
| 18 | +#- copyright Copyright 2018, Magenta Aps" |
| 19 | +#- license GNU General Public License |
| 20 | + |
| 21 | +#- |
| 22 | +#================================================================ |
| 23 | +# HISTORY |
| 24 | +# 2018/15/02 : danni : Script creation |
| 25 | +# |
| 26 | +#================================================================ |
| 27 | +# END_OF_HEADER |
| 28 | +#================================================================ |
| 29 | + |
| 30 | +INTERVAL=$1 |
| 31 | + |
| 32 | +CHECKIN_SCRIPT="/usr/share/os2borgerpc/bin/check-in.sh" |
| 33 | +CRON_PATH="/etc/cron.d/os2borgerpc-jobmanager" |
| 34 | + |
| 35 | +if [ $# -ne 1 ]; then |
| 36 | + echo "This job takes exactly one parameter." |
| 37 | + exit 1 |
| 38 | +fi |
| 39 | + |
| 40 | +if [ "$INTERVAL" -gt 59 ] || [ "$INTERVAL" -lt 3 ]; then |
| 41 | + echo "Interval must be between 3 and 59 inclusive." |
| 42 | + exit 1 |
| 43 | +fi |
| 44 | + |
| 45 | +RANDOM_NUMBER=$((RANDOM%INTERVAL+0)) |
| 46 | +CRON_COMMAND="$RANDOM_NUMBER," |
| 47 | +# Generate a pseudo-random number between 0 and 59 |
| 48 | +DELAY_IN_SECONDS=$((RANDOM%60)) |
| 49 | + |
| 50 | +# Make sure the folder for the check-in script exists |
| 51 | +mkdir --parents "$(dirname "$CHECKIN_SCRIPT")" |
| 52 | + |
| 53 | +cat <<EOF > "$CHECKIN_SCRIPT" |
| 54 | +#!/usr/bin/env sh |
| 55 | +
|
| 56 | +sleep $DELAY_IN_SECONDS |
| 57 | +
|
| 58 | +/usr/local/bin/jobmanager |
| 59 | +EOF |
| 60 | + |
| 61 | +chmod 700 "$CHECKIN_SCRIPT" |
| 62 | + |
| 63 | +while [ $((RANDOM_NUMBER+INTERVAL)) -lt 60 ] |
| 64 | +do |
| 65 | + RANDOM_NUMBER=$((RANDOM_NUMBER+INTERVAL)) |
| 66 | + if [ $((RANDOM_NUMBER+INTERVAL)) -ge 60 ] |
| 67 | + then |
| 68 | + CRON_COMMAND="$CRON_COMMAND$RANDOM_NUMBER * * * * root $CHECKIN_SCRIPT" |
| 69 | + else |
| 70 | + CRON_COMMAND="$CRON_COMMAND$RANDOM_NUMBER," |
| 71 | + fi |
| 72 | +done |
| 73 | +echo "$CRON_COMMAND" |
| 74 | + |
| 75 | +# Note: The PATH below is inherited by the scripts jobmanager runs. Fx. they can't find scripts in /usr/local/bin without it |
| 76 | +cat <<EOF > "$CRON_PATH" |
| 77 | +PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin |
| 78 | +$CRON_COMMAND |
| 79 | +EOF |
0 commit comments