
Я хотел бы написать команду 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