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


12

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

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

Ответы:


12

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запуск, правильно?
Уоррен

отлично - только что попробовал, и отлично работает :)
Уоррен

2
+1, но следует учитывать несколько моментов: если at-команда является первой строкой и если скрипт выполняется в течение длительного времени (или если интервалы короткие), то остерегайтесь одновременного запуска нескольких экземпляров. Но когда он atнаходится в последней строке сценария, то, очевидно, никакое перепланирование не будет выполнено, если сценарий завершится неудачей. Кроме того, запуск сценария из командной строки также приведет к его (пере) планированию (и: при этом одновременно может существовать несколько расписаний). И cronподдерживает отправку любых ошибок (или: вывод в целом) по электронной почте; Я не знаю, atесть ли что-то подобное?
Арджан

@ Арьян - Я не слишком беспокоился об этом неудачу , а не посылать мне по электронной почте .. так (на данный момент) Я просто использую его , чтобы получить удовольствие от моей рабочей станции :) ..however - что IS - то о думать если бы это было расширено, скажем, до случайной проверки на вторжение
Уоррен

сценарий, который я представляю, не будет заботиться о том, сколько копий само по себе запускается одновременно
Уоррен

13

У меня есть много команд в / 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

1
да, я знаю - «данные медленно меняются» - плагин получает курсы обмена валют с сайта, и я не хочу быть забаненным. (Я не трейдер, но я провожу много времени, наблюдая за графиками Мунина). Я сделал подобный плагин для местной погоды. Бесконечные приложения!
Энди Ли Робинсон

1
Ага! .. очень крутой подход :)
Уоррен

6

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

#!/bin/bash
sleep $(($RANDOM%5))
/path/to/command -param1 -param2

1
sleep () - это почти гарантия того, что поставщик услуг убьет его. Если, конечно, он является поставщиком услуг.
Гном

1
Я предположил, что это было на его собственной машине с Linux или чем-то еще, если он кому-то случайно приносит удачу
Джон Т.

ну это правда.
Гном

Почему сон плохая идея? Просто спрашиваю ...
Тадеуш А. Кадлубовский

выяснен вопрос для @John T
заповедное

6

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

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

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

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


@A Dwarf - спасибо за эту идею тоже - это был бы немного более полезный маршрут, если бы я хотел проверять наличие вторжений и т. Д. На некоторой частой, но квази-случайной основе
Уоррен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.