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



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



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

1321   8  

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,1620
  • now + 10 minutes
  • 2071-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

    Ничего не найдено.