8 ответов:
Если я понимаю, что вы ищете, вам нужно будет сделать что-то немного грязное, например, иметь задание cron, которое запускает сценарий bash, который рандомизирует время выполнения... Что-то вроде этого:
crontab:
0 9 * * * /path/to/bashscriptи в /path / to / bashscript:
#!/bin/bash maxdelay=$((14*60)) # 14 hours from 9am to 11pm, converted to minutes for ((i=1; i<=20; i++)); do delay=$(($RANDOM%maxdelay)) # pick an independent random delay for each of the 20 runs (sleep $((delay*60)); /path/to/phpscript.php) & # background a subshell to wait, then run the php script doneнесколько заметок: этот подход немного расточителен для ресурсов, так как он запускает 20 фоновых процессов в 9 утра, каждый из которых ждет случайного количества минут (до 14 часов, т. е. 11 вечера), затем запускает php скрипт и завершает работу. Кроме того, поскольку он использует случайное число минут (а не секунд), время начала не так случайно, как могло бы быть. Но $RANDOM только доходит до 32 767, и между 9 утра и 11 вечера есть 50 400 секунд, было бы немного сложнее рандомизировать секунды. Наконец, поскольку время начала является случайным и независимым друг от друга, возможно (но не очень вероятно), что будут запущены два или более экземпляров сценария одновременно.
Да, да, вопрос старше года, но, может быть, я могу добавить что-то полезное:
Как cron что-то на случайном смещении 20 раз в день между 9 утра и 11 вечера? Это довольно сложно в cron, потому что вы делите 14 часов на 20 раз выполнения. Мне не очень нравятся другие ответы, потому что они требуют написания сценария оболочки bash для вашего PHP-скрипта.
однако, если вы позволите мне свободу, чтобы облегчить ограничение времени и частоты до 13 раз между 8: 30 утра и 11: 09 вечера, это может сделать трюк, и все в пределах вашего crontab:
30 8-21/* * * * sleep ${RANDOM:0:2}m ; /path/to/script.php${RANDOM:3: 2} использует $RANDOM bash, который другие люди упоминали выше, но добавляет нарезку массива bash. Поскольку переменные bash не типизированы, псевдослучайное знаковое 16-разрядное число усекается до первых 2 из его 5 десятичных цифр, что дает вам краткую однострочную задержку вашего cronjob между 10 и 99 минутами (хотя распределение смещено в сторону 10 - 32).
следующее также может работать для вас, но я обнаружил, что по какой-то причине он "менее случайный" (возможно, закон Бенфорда вызван модуляцией псевдослучайных чисел. Эй, я не знаю, я завалил математику... Вините в этом Баша!):
30 8-21/* * * * sleep $[RANDOM\%90]m ; /path/to/script.phpвам нужно отобразить модуль как "\ % " выше, потому что cron (ну, по крайней мере, Linux 'vixie-cron') завершает линию, когда она сталкивается с неоткрытым"%".
может быть, вы могли бы получить оставшиеся 7 сценариев выполнения там добавление еще одной строки с другим 7-часовым диапазоном. Или ослабьте свое ограничение, чтобы работать между 3 утра и 11 вечера.
поэтому я использую следующее, чтобы запустить команду между 1AM и 330AM
0 1 * * * perl -le 'sleep rand 9000' && *command goes here*Это было заботиться о моих случайных потребностей для меня. Это 9000 секунд == 150 минут == 2,5 часа
Cron предлагает
RANDOM_DELAYпеременной. Смотритеcrontab(5)для сведения.переменная RANDOM_DELAY позволяет задерживать запуски заданий на случайную величину минуты с верхним пределом, заданным переменной.
это обычно видно в
anacronзадания, но также могут быть полезны вcrontab.возможно, вам нужно быть осторожным с этим, если у вас есть некоторые задания, которые работают в порядке (минута) детализация и другие, которые являются грубыми.
моей первой мыслью было бы создать одно задание cron, запускающее 20 случайно запланированных заданий. Элемент
atутилита (http://unixhelp.ed.ac.uk/CGI/man-cgi?at) используется для выполнения команд в указанное время.
Я в конечном итоге с помощью
sleep $(( 1$(date +%N) % 60 )) ; dostuffs(совместимый bash & sh)префикс 1 должен заставить не базовую 8 интерпретацию даты +%N (например, 00551454)
Не забудьте экранировать %, используя \% в файле crontab
* * * * * nobody sleep $(( 1$(date +\%N) \% 60 )) ; dostuffs
at -f [file] [timespec]или
echo [command] | at [timespec]или
at [timespec]... и интерактивная спецификация как 'ы.команда
при прогонах текст предоставляем на stdin или в файл, заданный
-f [file].Timespec
здесь
[timespec]грамматика. Это может быть что-то вроде:
- 24-часовое время как 4-значный int, например,
0100,2359,1620now + 10 minutes2071-05-31 - 5 hours 12 minutes UTCесли вы явно указываете часовой пояс,некоторые версии из timespec может позволить только
UTCдля дополнительного аргумента часового пояса.пример
cat script.sh | at now + $(($RANDOM % 10)) hours $(($RANDOM % 60)) minutes
at -f script.sh now + $(($RANDOM % 10)) hours $(($RANDOM % 60)) minutesпопробовать его...
вы можете проверить разбор bash, предварительно ожидая
echoуйти|(труба.)
echo cat script.sh \| at now + $(($RANDOM % 10)) hours $(($RANDOM % 60)) minutes
echo at -f script.sh now + $(($RANDOM % 10)) hours $(($RANDOM % 60)) minutesчтобы увидеть запланированные задания, используйте
atqи содержимое задания (среда vars, настройка и команда/скрипт) сat -c [jobid].Примечание
система является частью cron, и Интерактивное приглашение фактически захватывает все текущее состояние вашей оболочки, поэтому вы можете запускать команды без указания абсолютных путей.
для тех, кто погуглил сюда:
Если вы используете anacron (Ubuntu desktop и ноутбук), то вы можете редактировать
/etc/anacrontabи добавить
RANDOM_DELAY=XXгде XX-количество минут, которое вы хотите задержать базовое задание.
Anacron похож на cron, но он не ожидает, что ваш компьютер будет на 24x7 (например, наши ноутбуки) и будет запускать сценарии, которые он пропустил, потому что система была отключена.
Comments