Чи можу я зробити крон "випадковим"?


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

чудово - просто спробував це, і чудово працює :)
warren

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

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

сценарій, який я маю на увазі, не хвилюється, скільки копій себе працює одночасно
warren

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
ага! .. дуже класний підхід :)
warren

6

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

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

1
сон () - це майже гарантія, що він буде вбитий постачальником послуг. Якщо звичайно, він є постачальником послуг.
Гном

1
Я припускав, що це було на його власній машині Linux або що-небудь, якщо він навмання комусь випадково когось представляє
Джон Т

ну це правда.
Гном

Чому сон - погана ідея? Просто запитую ...
Тадеуш А. Кадлубовський

уточнив питання для @John T
warren

6

Це буде залежати від типу інтервалу, який ви після. але припустимо, що ви хочете, щоб сценарій запускався випадковим чином з ймовірністю 1:30 (раз на кожні 30 хвилин)

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

  • Всередині сценарію використовуйте rand як умову для заяви if . Ви хочете, щоб rand повернув число від 0 до 2. Якщо це 0, виконайте вміст оператора if.

По суті, ваш сценарій завжди спрацьовує через встановлений інтервал. Але буде виконувати лише команду, яка вас зацікавила, випадковим чином. Ваш постачальник послуг буде вам вдячний.


@ Гном - спасибі і за цю ідею - це був би дещо корисніший маршрут, якби я хотів перевірити наявність вторгнень тощо на якійсь частой, але квазі випадковій основі
warren
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.