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.

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

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)

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.