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


12

Я хочу, щоб сценарій запускався раз на день, щодня, починаючи з 0900 до 1200.
Я не повністю впевнений у синтаксисі тире - чи означає це, що сценарій буде працювати кожну годину між ними 9-12, або що він почне РАДНО 9-12? Тому що мені потрібно останнє.

Відповіді:


8

Я ніколи не бачив впровадження Cron, який має спосіб запустити роботу у випадковий час. Це дивна вимога. Як зазначається в документації, 9-12це ярлик 9,10,11,12і означає щогодини з 9 до 12.

Якщо ви хочете виконати завдання у випадковий час, запустіть його на початку інтервалу та додайте випадкову затримку. Наприклад, для запуску в довільну годину між 9 і 12:

SHELL=/bin/bash
0 9 * * * sleep $((3600 * (RANDOM % 4))); do_stuff

Зверніть увагу, що RANDOMпотрібні bash або ksh, вони можуть бути недоступні в оболонці за замовчуванням.

Якщо ви хочете запуститись у довільний час між 9 і 12, з другою роздільною здатністю, ви можете використовувати RANDOM % 10800як затримку, але, оскільки RANDOMзнаходиться в діапазоні 0..32767, буде ухил до затримок між 0 і 32768% 10800 = 368. Щоб уникнути цього упередження:

SHELL=/bin/bash
0 9 * * * max=$((32768/10800*10800)); while delay=$RANDOM; ((delay > max)); do :; done; sleep $((delay % 10800)); do_stuff

5
"Це дивна вимога." Я не погоджуюсь. Багато додатків, особливо ті, яким потрібно періодично здійснювати реєстрацію на сервері (наприклад, менеджери пакетів або клієнти з управління конфігурацією), потребують відтворення часу їх виконання, щоб уникнути громозного стада . Насправді, у багатьох таких додатках є вбудовані параметри splay (наприклад, --randomwaitаргумент yum чи --splayаргумент chef-client), але для тих, хто цього не робить, корисним елементом у планувальнику завдань може стати випадковий час виконання.
jayhendren


2

У мене з’явилася аналогічна вимога до скриптів python, але я реалізував це за допомогою самого сценарію, використовуючи випадкові + функції сну, потім запустив роботу cron @ півночі

from time import sleep
import random

sleep_time = random.randint(0,7200)  #7200 seconds = 2 hours * 60 min * 60 sec
print(sleep_time)
sleep(sleep_time)

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