Я хотел бы написать команду cron, чтобы задание выполнялось один раз в случайное время в течение недели - возможно ли это без изменения самого crontab? Я подумал о написании функции, которая на основе генератора случайных чисел может выполнять или не выполнять задачу, но я бы хотел, чтобы команда точно выполнялась, и не было ни одной секунды на неделе, которая была бы более вероятной, чем любая другая второй ...
5 ответов
Одним из быстрых решений является написание сценария cron, который вызывается один раз в неделю и задерживается на случайное время (не более недели) перед выполнением реальной работы, например, с помощью следующей команды (работает для bash и zsh)
sleep $(($RANDOM/32768.*60*24*7))m
Используйте комбинацию cron
и at
. Ваш скрипт crontabbed будет содержать что-то похожее на:
TIME=$(($RANDOM/32768.*60*24*7))m
at -f /usr/local/bin/scriptfile $TIME
В /usr/local/bin/scriptfile
есть команды, которые вы хотите запустить.
Я собрал небольшой скрипт под названием 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
Лаки прав, но его объяснение немного короткое.
хрон:
0 15 * * 1 /home/myhome/cron/schedulerandomjob.bash
/home/myhome/cron/schedulerandomjob.bash:
#!/bin/bash
TIME="now + $(( RANDOM % (60*24*7) )) minutes "
at -f /path/to/your/script $TIME
cron запускается один раз в неделю, составляя расписание задания «at», которое происходит случайным образом в течение недели. (Нб. Здесь есть угловой случай, за которым нужно следить ... возможно, задание будет выполнено в конце недели и в начале недели, что может привести к двум одновременным казням. Если это важно, отнимите несколько минут от модуля, чтобы быть уверенным.
Быстрое (и грязное, и BAD, см. Комментарии ниже) решение этой проблемы состояло бы в создании bash-скрипта, который работал бы каждый день как cron и имел следующий дизайн:
Этот сценарий оболочки будет иметь шанс 1/7 запускать вашу команду каждый день и обновлять временную метку файла при каждом его успешном запуске (для этого используйте «touch»).
Вам просто нужно проверить, что файлу> 7 дней, чтобы решить, запускаете ли вы сценарий заранее ('find' может выполнить работу здесь).
Должен быть лучший способ, но я слишком устал, чтобы видеть это ^^
Обновление: как указал Джо, у этого скрипта есть большой недостаток, заключающийся в том, что он может (и в конечном итоге) не будет работать вообще несколько недель. Таким образом, вы не должны использовать это, но я оставлю это как контрпример.