Подтвердить что ты не робот

Работы Cron и случайные времена, в течение заданных часов

Мне нужна возможность запуска PHP script 20 раз в день в совершенно случайные времена. Я также хочу, чтобы он работал только между 9:00 - 23:00.

Я знаком с созданием заданий cron в linux.

4b9b3361

Ответ 1

Если я понимаю, что вы ищете, вам нужно сделать что-то немного грязное, например, выполнить задание 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 будут запущены одновременно.

Ответ 2

Да, да, вопрос старше года, но, может быть, я могу добавить что-то полезное:

Как 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.

Ответ 3

Итак, я использую следующую команду для запуска команды между 1AM и 330AM

0 1 * * * perl -le 'sleep rand 9000' && *command goes here*

Это заботится о моих случайных потребностях для меня. Это 9000 секунд == 150 минут == 2,5 часа

Ответ 4

Cron предлагает переменную RANDOM_DELAY. Подробнее см. crontab(5).

Переменная RANDOM_DELAY позволяет задерживать запуск заданий случайным количеством минут с верхним пределом, указанным переменной.

Это обычно наблюдается в anacron заданиях, но также может быть полезно в crontab.

Возможно, вам придется быть осторожным с этим, если у вас есть некоторые задания, которые выполняются в порядке (минута) и другие, которые являются грубыми.

Ответ 5

Моя первая мысль заключалась в том, чтобы создать одно задание cron, запускающее 20 случайно запланированных на рабочих местах. Утилита at (http://unixhelp.ed.ac.uk/CGI/man-cgi?at) используется для выполнения команд в указанное время.

Ответ 6

В итоге я использовал 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 

Ответ 7

at -f [file] [timespec]

или

echo [command] | at [timespec]

или

at [timespec]... и интерактивная спецификация  как запись script.

Команда

При запуске текст предоставляется на stdin или в файле, указанном -f [file].

TimeSpec

Здесь [timespec] грамматика. Это может быть что-то вроде:

  • 24-часовое время как 4-значный int, например. 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, и интерактивное приглашение фактически фиксирует все текущее состояние вашей оболочки, поэтому вы можете запускать команды без указания абсолютных путей.

Ответ 8

Для тех, кто гуглил здесь путь:

Если вы используете anacron (рабочий стол Ubuntu и ноутбук), вы можете отредактировать

/etc/anacrontab

и добавить

RANDOM_DELAY=XX 

Где XX - количество минут, которое вы хотите отложить базовую работу.

Anacron похож на cron, но он не ожидает, что ваш компьютер будет работать в режиме 24x7 (как наши ноутбуки), и будет запускать скрипты, которые он пропустил из-за сбоя системы.

Ответ 9

Решение al-x не работает для меня, так как команды crontab не выполняются в bash, но в sh я думаю. Что работает это:

30 8 * * * bash -c "sleep $[RANDOM\%90]m" ; /path/to/script.py