Zadanie Cron, losowy start, ale w określonym czasie

12

Chcę, aby skrypt był uruchamiany raz dziennie, codziennie, zaczynając od 0900 do 1200.
Nie jestem do końca pewien co do składni kreski - czy to oznacza, że ​​skrypt będzie działał KAŻDEJ godziny między 9-12, lub że będzie uruchamiany LOSOWO między 9-12? Ponieważ potrzebuję tego drugiego.

little_sg
źródło

Odpowiedzi:

8

Nigdy nie widziałem implementacji crona, która ma sposób na uruchomienie zadania w przypadkowym czasie. To dziwny wymóg. Jak wynika z dokumentacji, 9-12jest skrótem 9,10,11,12i oznacza co godzinę od 9 do 12.

Jeśli chcesz uruchomić zadanie w przypadkowym czasie, uruchom je na początku przedziału i dodaj losowe opóźnienie. Na przykład, aby uruchomić w losowej godzinie od 9 do 12:

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

Zauważ, że RANDOMwymaga bash lub ksh, może nie być dostępne w domyślnej powłoce.

Jeśli chcesz uruchomić w losowym czasie od 9 do 12, z drugą rozdzielczością, możesz użyć RANDOM % 10800jako opóźnienia, ale ponieważ RANDOMjest w zakresie 0..32767, wystąpi odchylenie w kierunku opóźnień między 0 a 32768% 10800 = 368. Aby uniknąć tego błędu:

SHELL=/bin/bash
0 9 * * * max=$((32768/10800*10800)); while delay=$RANDOM; ((delay > max)); do :; done; sleep $((delay % 10800)); do_stuff
Gilles „SO- przestań być zły”
źródło
5
„To dziwny wymóg”. Nie zgadzam się. Wiele aplikacji, zwłaszcza tych, które muszą okresowo logować się na serwerze (np. Menedżerowie pakietów lub klienci zarządzania konfiguracją), muszą wydłużyć czas wykonywania, aby uniknąć sytuacji stada grzmotów . W rzeczywistości wiele takich aplikacji ma wbudowane opcje splay (np. --randomwaitArgumenty do yum lub --splayargumenty do szefa-klienta), ale dla tych, którzy tego nie robią, losowy czas wykonania byłby pomocną funkcją w harmonogramie zadań.
jayhendren
2

Skończyło się na tym, że mam podobne wymagania dotyczące skryptów Pythona, ale w końcu wdrożyłem to za pomocą samego skryptu, używając funkcji losowego + uśpienia, a następnie uruchamiając zadanie cron @ północ

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)
FlyingZebra1
źródło
W ten sposób popularne skrypty z Linuksa często losowo określają czas rozpoczęcia: ustalony czas, a następnie uśpienie na początku.
Ned64