Cron işi, rastgele başlangıç, ancak zaman aralığı içinde


12

Ben bir script 0900 ve 1200 arasında herhangi bir zamanda başlayarak, günde bir kez, her gün çalıştırmak istiyorum
. Dash sözdizimi hakkında tamamen emin değilim - bu komut dosyası arasında HER saat çalışacak 9-12veya RANDOMLY arasında başlayacağı anlamına mı geliyor 9-12? Çünkü ikincisine ihtiyacım var.

Yanıtlar:


8

Rastgele bir zamanda bir işi yürütmenin bir yolu olan bir cron uygulaması görmedim. Bu garip bir gereklilik. Belgelerin belirttiği gibi, her saat 9 ila 12 arasında 9-12bir kısayol 9,10,11,12ve anlamına gelir.

Bir işi rastgele bir zamanda çalıştırmak istiyorsanız, aralığın başlangıcında işi çalıştırın ve rastgele bir gecikme ekleyin. Örneğin, 9 ile 12 arasında rastgele bir saatte çalıştırmak için:

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

Not RANDOMbash veya ksh gerektirir, varsayılan kabuğunda mevcut olmayabilir.

9 ve 12 arasında rastgele bir zamanda ikinci çözünürlükle çalıştırmak istiyorsanız RANDOM % 10800, gecikme olarak kullanabilirsiniz , ancak RANDOM0..32767 aralığında olduğu için, 0 ile 32768 arasındaki gecikmelere karşı bir önyargı olacaktır.% 10800 = 368. Bu önyargıyı önlemek için:

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

5
"Bu garip bir gereklilik." Katılmıyorum. Birçok uygulamanın, özellikle de düzenli olarak bir sunucuya (paket yöneticileri veya yapılandırma yönetimi istemcileri gibi) giriş yapması gerekenler, gürleyen bir sürü durumundan kaçınmak için yürütme sürelerini yaymalıdır . Aslında, bu tür birçok uygulama yerleşik olarak splay seçeneklerine sahiptir (örn --randomwait. Yum'a --splayargüman veya şef-istemciye argüman), ancak olmayanlar için rastgele bir yürütme süresi bir iş zamanlayıcısında yararlı bir özellik olacaktır.
jayhendren


2

Python betikleri için benzer bir gereksinime sahip oldum, ancak rastgele + uyku işlevlerini kullanarak betiğin kendisi aracılığıyla uygulamayı bitirdim, sonra cron işini gece yarısı başlattım

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 dağıtımlarındaki yaygın komut dosyaları genellikle başlama zamanını rasgele belirler: Sabit bir zaman geçirin, sonra başlangıçta uyuyun.
Ned64

0

OpenBSD'de, sürüm 6.7'den (yaklaşık 15 Nisan 2020'den beri anlık görüntülerde), ~bir crontab dosyasında ile rastgele zaman aralıkları belirtebilirsiniz :

Bir ~ alandaki karakter kullanılarak rastgele bir değer (yasal aralık dahilinde) elde edilebilir . Rastgele değerin aralığı açıkça belirtilebilir, örneğin 0~300 ile 30 arasında bir rastgele değer ile sonuçlanır. Her iki tarafındaki sayılardan biri (veya her ikisi) ~atlanırsa, alan için uygun sınır (düşük veya yüksek) kullanılır.

30~45 * * * * somecommand

bu nedenle somecommand15 dakikalık aralıkta, her saatin yarısını çeyrek ile bir sonraki saatte, her saat arasında bir noktada yürütür .

Kullanımı yana ~alır, bir tek belirli bir aralıkta, fakat rastgele değer, crontab gibi

~ 9~11 * * * somecommand

her gün sabah 9:00 ile öğlen (11:59) arasında bir noktada soruda istendiği gibi komutu çalıştırırdı.

Ayrıca bakınız

Uyarı (kılavuzda belirtilmemiş): Rastgele zamanlar rastgele seçilir, ancak crontab yeniden yüklenene kadar, yani cron daemon yeniden başlayana veya crontab ile düzenlenene kadar sabitlenircrontab -e . Bu nedenle kullanmak gibi, işin her çalışma için yeni bir rasgele değer sağlamak olmaz sleepile $RANDOMyapardı.


0

Bu cevapların çoğu taşınabilir olmayan özelliklere veya bashisms'e dayanıyor - çizgi istemiş olduğunuzdan, burada taşınabilir bir çözüm var:

0 9 * * * sleep $(echo | awk '{print rand()*3600*3};') && whatever_you_wanted_to_do

Bu, yalnızca POSIX altında varolan garantili sözdizimlerini ve sözdizimini kullanır ve en küçük minimum yüklemeyle bile herhangi bir UNIX üzerinde çalışmalıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.