Можно ли сделать cron «случайным»?

17256
warren

Может быть, я совершенно чокнутый, и если так - это нормально. Но как мне запланировать работу, чтобы по какому-то случайному расписанию транслировать глупое сообщение, например, из fortune?

уточнение
да - это моя личная рабочая станция - не планирую делать что-то шаткое на рабочем сервере :)

12

4 ответа на вопрос

13
Andy Lee Robinson

У меня есть много команд в / etc / crontab, которые делают разные вещи, а некоторые требуют точности в считанные секунды. Теперь cron может иметь более высокое разрешение, сохраняя все время видимым и централизованным.

Этот пример получает и анализирует веб-страницу от 10 до 50 секунд перед каждыми 5 минутами:

4-59/5 * * * * root (sleep $(($RANDOM\%40+10))) && /etc/munin/plugins/someplugin prefetch 

Он не должен иметь точное время, поскольку данные медленно перемещаются, но он помогает максимально сократить время выполнения munin-узла, не дожидаясь веб-страниц. (Плагин дополнительно кэширует страницу в течение 30 минут, чтобы уменьшить ненужные попадания, но должен обновлять базу данных каждые 5 минут).

Обратите внимание, что \% - cron заменяет% на «\ n» - полезно для хранения текста в одной строке.

если вы кэшируете веб-страницы, вы не обязательно получите точные результаты загрузки warren 12 лет назад 0
да, я знаю - «данные медленно меняются» - плагин получает курсы обмена валют с сайта, и я не хочу быть забаненным. (Я не трейдер, но я провожу много времени, наблюдая за графиками Мунина). Я сделал подобный плагин для местной погоды. Бесконечные приложения! Andy Lee Robinson 12 лет назад 1
Ага! .. очень классный подход :) warren 12 лет назад 1
12
mas

atимеет более простой интерфейс для этого типа целей, если atон установлен, машина работает, atdи пользователю разрешено использовать эту команду.

Например (проверьте точный синтаксис с помощью man atили info at),

at -f файл now + 53 minutes

или же

at -f файл now + 2 hours

выполнит команды в указанном файле через 53 минуты или 2 часа соответственно.

at затем может быть перезапущен в начале запланированного задания с подходящими (случайным или иным образом) начальными, счетными и временными единицами.

редактировать

Как подсказывает Арджан ниже, если вы используете это не для игрушек, а для других, вам нужно подумать о таких проблемах, как, например,

  1. если следующий запуск начинается до того, как завершится предыдущий (например, повторный вход сценария?) или

  2. если пробег не завершается правильно или

  3. если следующий запуск не запускается вообще или вовремя (например, что произойдет, если машина выключится, когда должен быть запущен следующий запуск), и

  4. о регистрации и отчетности о неудачных или успешных запусках.

этот подход я не рассматривал - и его можно сделать рекурсивным, если `file` содержит следующий` at`, правильно? warren 15 лет назад 0
отлично - только что попробовал и отлично работает :) warren 15 лет назад 0
+1, но следует учитывать несколько моментов: если команда `at` является первой строкой, и если скрипт выполняется в течение длительного времени (или если интервалы короткие), то остерегайтесь одновременного запуска нескольких экземпляров. Но когда `at` находится в последней строке сценария, то, очевидно, никакое повторное планирование не будет выполнено, если сценарий завершится неудачей. Кроме того, запуск сценария из командной строки также приведет к его (пере) планированию (и: при этом одновременно может существовать несколько расписаний). И `cron` поддерживает отправку любых ошибок (или: вывод вообще) по электронной почте; Я не знаю, есть ли у 'at` что-то подобное? Arjan 15 лет назад 2
@Arjan - Я не слишком беспокоюсь о том, что это не удастся и не отправит мне электронное письмо .., поскольку (на данный момент) я просто использую это, чтобы повеселиться на своей рабочей станции :) .. однако - это * IS * что-то для подумайте, если бы это было расширено, скажем, до случайной проверки на вторжение warren 15 лет назад 0
сценарий, который я представляю, не заботится о том, сколько копий запущено одновременно warren 15 лет назад 0
6
John T

Внутренне cron, я не думаю, что такая особенность существует. Я думаю, что лучшим решением было бы поместить вашу команду в сценарий оболочки, поместить произвольный sleepинтервал в верхнюю часть сценария и использовать $RANDOMпеременную. Затем запускайте скрипт один раз в день в обычной работе cron.

#!/bin/bash sleep $(($RANDOM%5)) /path/to/command -param1 -param2 
sleep () - это почти гарантия того, что поставщик услуг убьет его. Если, конечно, он является поставщиком услуг. A Dwarf 15 лет назад 1
Я предполагал, что это на его собственной машине с Linux или чем-то вроде того, если он кому-то дарует удачу наугад John T 15 лет назад 1
ну это правда. A Dwarf 15 лет назад 0
Почему сон плохая идея? Просто спрашиваю... Tadeusz A. Kadłubowski 15 лет назад 0
уточнил вопрос для @John T warren 15 лет назад 0
6
A Dwarf

Это будет зависеть от того, какой тип интервала вы после. но давайте предположим, что вы хотите, чтобы скрипт запускался случайным образом с вероятностью 1:30 (один раз каждые 30 минут)

  • Создайте свой скрипт cron для перидоты, скажем, 10 минут. Он будет стрелять 3 раза каждые 30 минут.

  • Внутри скрипта используйте rand как условие для оператора if . Вы хотите, чтобы rand возвращал число от 0 до 2. Если оно равно 0, выполните содержимое оператора if.

По сути, ваш скрипт всегда запускается с заданным интервалом. Но выполнит только интересующую вас команду случайным образом. Ваш поставщик услуг поблагодарит вас.

@A Dwarf - спасибо за эту идею тоже - это был бы немного более полезный маршрут, если бы я хотел проверять вторжения и т. Д. На некоторой частой, но квази-случайной основе warren 15 лет назад 0