рандомизированная команда cron

рандомизированная команда cron

Я хотел бы написать команду cron, чтобы задание выполнялосьодин разв случайное время в течение недели — возможно ли это без изменения самого crontab? Я думал написать функцию, которая на основе генератора случайных чисел может выполнить или не выполнить задачу — но я бы хотел, чтобы команда точно выполнялась и не было секунды в неделе, которая была бы более вероятной, чем любая другая секунда...

решение1

Одним из быстрых решений является написание скрипта cron, который вызывается раз в неделю и откладывается на случайное время (не дольше недели) перед выполнением реальной работы, например, с помощью следующей команды (работает для bash и zsh):

sleep $(($RANDOM/32768.*60*24*7))m

решение2

Используйте комбинацию cronи at. Ваш скрипт crontab будет содержать что-то похожее на:

TIME=$(($RANDOM/32768.*60*24*7))m
at -f /usr/local/bin/scriptfile $TIME

В нем /usr/local/bin/scriptfileнаходятся команды, которые вы хотите выполнить.

решение3

Быстрое (и грязное, и ПЛОХОЕ, см. комментарии ниже) решение этой проблемы — создание скрипта bash, который будет запускаться каждый день как cron и будет спроектирован следующим образом:

Этот скрипт оболочки будет иметь 1/7 шанс выполнить вашу команду каждый день и будет обновлять временную метку файла каждый раз, когда он успешно запускается (используйте 'touch' для этого).
Вам просто нужно будет проверить, что файл >7 дней назад, чтобы решить, запускать ли скрипт заранее (здесь эту работу может выполнить 'find').

Должен быть способ получше, но я слишком устал, чтобы его увидеть ^^

обновлять: Как указал Джо, у этого скрипта есть большой недостаток: он может (и в конечном итоге будет) не запускаться несколько недель. Таким образом, вам не следует его использовать, но я оставлю его в качестве контрпримера.

решение4

Я составил небольшой скрипт под названием weekrand(искал где-то в интернете совет, забыл где), который делает именно это:

#!/bin/bash

FLOOR=1
RANGE=10080 # number of minutes per week

number=0   #initialize
while [ "$number" -le $FLOOR ]
do
  number=$RANDOM
  let "number %= $RANGE"  # Scales $number down within $RANGE.
done

sleep ${number}m
$@

Таким образом, по сути, weekrand {some command} {parameters}выполнение будет происходить случайным образом {some command}в {parameters}интервале от 0 до 10080 минут, т.е. в течение недели.

Пример crontabстроки с его использованием:

 0  0    1   *   *      nice -n 10 /usr/local/bin/weekrand /root/jobs/weekly_job

Связанный контент