2

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

5 ответов5

5

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

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

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

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

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

0

Я собрал небольшой скрипт под названием 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

Лаки прав, но его объяснение немного короткое.

хрон:

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», которое происходит случайным образом в течение недели. (Нб. Здесь есть угловой случай, за которым нужно следить ... возможно, задание будет выполнено в конце недели и в начале недели, что может привести к двум одновременным казням. Если это важно, отнимите несколько минут от модуля, чтобы быть уверенным.

0

Быстрое (и грязное, и BAD, см. Комментарии ниже) решение этой проблемы состояло бы в создании bash-скрипта, который работал бы каждый день как cron и имел следующий дизайн:

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .