Мне нужна возможность запуска PHP script 20 раз в день в совершенно случайные времена. Я также хочу, чтобы он работал только между 9:00 - 23:00.
Я знаком с созданием заданий cron в linux.
Мне нужна возможность запуска PHP script 20 раз в день в совершенно случайные времена. Я также хочу, чтобы он работал только между 9:00 - 23:00.
Я знаком с созданием заданий cron в linux.
Если я понимаю, что вы ищете, вам нужно сделать что-то немного грязное, например, выполнить задание cron, которое запускает bash script, который рандомизирует время выполнения... Что-то вроде этого:
кронтаб:
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 скрипт
done
Несколько примечаний: этот подход немного расточительно ресурсов, поскольку он запускает 20 фоновых процессов в 9 утра, каждый из которых ждет около случайного количества минут (до 14 часов, т.е. 11 вечера), а затем запускает php script и завершает работу. Кроме того, поскольку он использует случайное число минут (не секунд), время начала не так просто, как могло бы быть. Но $RANDOM только доходит до 32 767, а между 9 утра и 11 вечера - 50 400 секунд, было бы немного сложнее рандомизировать секунды. Наконец, поскольку начальные моменты случайны и независимы друг от друга, возможно (но не очень вероятно), что два или более экземпляра script будут запущены одновременно.
Да, да, вопрос старше года, но, может быть, я могу добавить что-то полезное:
Как cron что-то при случайном смещении 20 раз в день между 9 утра и 11 вечера? Это нечто сложное в cron, потому что вы делите 14 часов на 20 раз. Мне не нравятся другие ответы, потому что они требуют записи bash обертки script для вашего PHP скрипт.
Однако, если вы позволите мне освободить время и ограничение частоты до 13 раз с 8:30 до 23:09, это может сделать трюк и все в пределах вашего crontab:
30 8-21/* * * * sleep ${RANDOM:0:2}m ; /path/to/script.php
${RANDOM: 3: 2} использует bash $RANDOM, о котором говорили другие люди, но добавляет срез массива bash. Поскольку переменные bash являются нетипизированными, псевдослучайное 16-разрядное число, подписанное с псевдослучайным кодом, усекается до первых двух его пяти десятичных цифр, что дает вам краткий однострочный шрифт для задержки вашей кроны между 10 и 99 минутами (хотя распределение смещен в сторону от 10 до 32).
Для вас может быть и следующее: но почему-то я обнаружил, что это по какой-то причине "менее случайное" (возможно, закон Бенфорда инициируется путем модуляции псевдослучайных чисел. Эй, я не знаю, я завалил математику. Вините его на bash!):
30 8-21/* * * * sleep $[RANDOM\%90]m ; /path/to/script.php
Вам нужно отобразить модуль как '\%' выше, потому что cron (ну, по крайней мере, Linux vixie-cron) завершает линию, когда встречается с невыраженным "%".
Возможно, вы могли бы получить оставшиеся 7 script исполнения там, добавив еще одну строку с другим 7-часовым диапазоном. Или расслабьте свое ограничение, чтобы работать между 3:00 и 11:00.
Итак, я использую следующую команду для запуска команды между 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
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]
... и интерактивная спецификация
как запись 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, setup и command/script) с помощью at -c [jobid]
.
Система является частью cron, и интерактивное приглашение фактически фиксирует все текущее состояние вашей оболочки, поэтому вы можете запускать команды без указания абсолютных путей.
Для тех, кто гуглил здесь путь:
Если вы используете anacron (рабочий стол Ubuntu и ноутбук), вы можете отредактировать
/etc/anacrontab
и добавить
RANDOM_DELAY=XX
Где XX - количество минут, которое вы хотите отложить базовую работу.
Anacron похож на cron, но он не ожидает, что ваш компьютер будет работать в режиме 24x7 (как наши ноутбуки), и будет запускать скрипты, которые он пропустил из-за сбоя системы.
Решение al-x не работает для меня, так как команды crontab не выполняются в bash, но в sh я думаю. Что работает это:
30 8 * * * bash -c "sleep $[RANDOM\%90]m" ; /path/to/script.py