Мені потрібна можливість запускати PHP-скрипт 20 разів на день в абсолютно випадковий час. Я також хочу, щоб він працював лише з 9:00 до 23:00.
Я знайомий зі створенням робочих місць у Linux.
Мені потрібна можливість запускати PHP-скрипт 20 разів на день в абсолютно випадковий час. Я також хочу, щоб він працював лише з 9:00 до 23:00.
Я знайомий зі створенням робочих місць у Linux.
Відповіді:
Якщо я розумію, що ви шукаєте, вам потрібно буде зробити дещо безладно, наприклад, мати роботу 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 годин, тобто 23 вечора), після чого запускає php-скрипт і виходи. Крім того, оскільки він використовує випадкову кількість хвилин (а не секунд), час початку не є настільки випадковим, як це могло б бути. Але $ RANDOM піднімається лише до 32 767, а між 9:00 та 23:00 - 50 400 секунд, було б трохи складніше також рандомизувати секунди. Нарешті, оскільки час запуску випадковий і незалежний один від одного, можливо (але не дуже ймовірно), що два або більше екземплярів сценарію будуть запущені одночасно.
((maxdelay = 14 * 60))
або ((delay = $RANDOM % maxdelay))
). sleep
Аргумент ще повинен бути шлях у вас є (хоча ви можете додати прогалини, якщо це необхідно).
sleep $[ ( $RANDOM % 60 ) + 1 ]s && some_script.sh
Так, так, питанню вже більше року, але, можливо, я можу додати щось корисне:
Як хрон щось у випадковому зміщенні 20 разів на день між 9:00 та 23:00? Це досить складно в рамках cron, тому що ви ділите 14 годин на 20 разів виконання. Інші відповіді мені не дуже подобаються, тому що вони вимагають написання сценарію обгортки bash для вашого php-сценарію.
Однак, якщо ви дозволите мені полегшити обмеження часу та частоти до 13 разів з 8:30 до 23: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 ранку та 23 вечора.
$[(RANDOM/368)+10]
?
$((RANDOM % 90 + 10))
Тест:for i in {0..9999}; do echo $((RANDOM % 90 + 10)); done | sort | uniq -c
$RANDOM
: sleep $(( $(od -N1 -tuC -An /dev/urandom) \% 90 ))m
.
crontab
використовується bash
перед використанням $RANDOM
. Якщо у вас є vixie-cron
(здається, це моя справа в Ubuntu), ви можете додати SHELL=/bin/bash
до початку. Тут є інші альтернативи для інших версій cron: superuser.com/a/264541/260350
crontab: errors in crontab file, can't install. Do you want to retry the same edit?
допомогу
Отже, я використовую наступне для запуску команди між 1 ранку та 330 ранку
0 1 * * * perl -le 'sleep rand 9000' && *command goes here*
Це піклується про мої випадкові потреби в мені. Це 9000 секунд == 150 хвилин == 2,5 годин
Cron пропонує RANDOM_DELAY
змінну. Детальніше crontab(5)
див.
Змінна RANDOM_DELAY дозволяє затримувати запуски завдань випадковою кількістю хвилин з верхньою межею, заданою змінною.
Це часто спостерігається на anacron
робочих місцях, але також може бути корисним у crontab
.
Можливо, вам доведеться бути обережним із цим, якщо у вас є деякі завдання, які виконуються з точною (щохвилинною) деталізацією, а інші грубі.
RANDOM_DELAY
встановлюється один раз і залишається незмінним протягом усього часу роботи демона.
RANDOM_DELAY
Прапор особливість cronie-crond в той час як Ubuntu , здається, працює в vixie-cron
якому відсутній цей прапор.
Моєю першою думкою було б створити одне завдання cron, запускаючи 20 випадково запланованих на робочих місцях. at
Корисності (http://unixhelp.ed.ac.uk/CGI/man-cgi?at) використовуються для виконання команд в заданий час.
У підсумку я використав sleep $(( 1$(date +%N) % 60 )) ; dostuffs
(сумісно з bash & sh)
Префікс 1 призначений для примусової інтерпретації бази NON 8 дати +% N (наприклад, 00551454)
Не забудьте уникнути%, використовуючи \% у файлі crontab
* * * * * nobody sleep $(( 1$(date +\%N) \% 60 )) ; dostuffs
date
(що ви, мабуть, робите на більшості Linux, але не на Busybox, стандартному MacOS чи інших платформах, похідних від BSD).
Рішення al-x у мене не працює, оскільки команди crontab виконуються не в bash, а в sh я думаю. Що означає робота:
30 8 * * * bash -c "sleep $[RANDOM\%90]m" ; /path/to/script.py
$[ ... ]
є застарілим синтаксисом, оскільки waaaay назад; для будь-чого з цього тисячоліття ви віддаєте перевагу, $((RANDOM\%90))m
який є сумісним з POSIX синтаксисом (але, звичайно RANDOM
, все ще лише Bash).
at -f [file] [timespec]
або
echo [command] | at [timespec]
або
at [timespec]
... та інтерактивна специфікація, як script
запис.
Під час запуску текст надає на stdin або у файлі, вказаному-f [file]
.
Ось [timespec]
граматика . Це може бути щось на зразок:
0100
, 2359
,1620
now + 10 minutes
2071-05-31 - 5 hours 12 minutes UTC
Якщо ви чітко вказуєте часовий пояс, деякі версії можуть лише дозволяти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
вхід і витягнувши |
(pipe).
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), тоді ви можете редагувати
/etc/anacrontab
і додати
RANDOM_DELAY=XX
Де XX - кількість хвилин, яку потрібно відкласти на базове завдання.
Anacron схожий на cron, але він не очікує, що ваш комп’ютер буде працювати в режимі 24x7 (як наші ноутбуки) і буде запускати скрипти, які він пропустив, оскільки система не працювала.
За допомогою цього прикладу можна спробувати використовувати випадкові випадки перед виконанням команди:
#!/bin/bash
# start time
date +"%H:%M:%S"
# sleep for 5 seconds
sleep $(shuf -i 1-25 -n 1)
# end time
date +"%H:%M:%S"
А як щодо створення сценарію, який щодня переписує crontab?
Я усвідомлюю, що це старіший ланцюжок, але я хочу додати одну річ, пов’язану з випадковими значеннями, яку я часто використовую. Замість того, щоб використовувати змінну $ RANDOM із фіксованим та обмеженим діапазоном, я часто роблю випадкові значення довільного діапазону в оболонці з
dd if=/dev/urandom bs=4 count=1 2>/dev/null | od -N4 -t u4 -A none
так що ви можете зробити, наприклад,
FULLRANDOM=$(dd if=/dev/urandom bs=4 count=1 2>/dev/null | od -N4 -t u4 -A none)
і подолати деякі обмеження, про які йшлося в цій темі.
~$info dd
і я можу зрозуміти, що відбувається з лівого боку |
, але не можу розібрати правого. Отже, для мене та інших, хто зацікавлений у overcoming some restrictions
генерації випадкових значень, чому б не взяти хвилину, щоб пояснити RHS, і зробити сильніший крок для використання вашого підходу. Поглиблене пояснення робить людей комфортними як для запропонованого вами процесу, так і для його переваг. Дякую.