Cronu “rastgele” yapabilir miyim?


12

Belki de tamamen deliyim ve öyleyse - sorun değil. Fakat bir işi bazı rasgele zamanlamalar için nasıl bir saçma mesaj yayınlamak için planlarım fortune?

açıklama
evet - bu benim kişisel iş istasyonum - bir üretim sunucusunda riskli bir şey yapmayı planlamıyorum :)

Yanıtlar:


12

atatkuruluysa, makine çalışıyorsa atdve kullanıcının komutu kullanmasına izin verilirse , bu amaç için daha basit bir arayüze sahiptir .

Örneğin ( man atveya kullanarak sözdizimini tam olarak kontrol edin info at),

at -f dosya now + 53 minutes

veya

at -f dosya now + 2 hours

komutları belirtilen dosyada sırasıyla 53 veya 2 saatte çalıştıracaktır.

at programlanan işin başında uygun (rastgele veya başka türlü) başlangıç, sayım ve zaman birimleriyle tekrar çalıştırılabilir.

Düzenle

Arjan'ın aşağıda yararlı bir şekilde işaret ettiği gibi, bunu bir oyuncak uygulaması haricinde kullanıyorsanız, ne olduğu gibi konular hakkında düşünmeniz gerekir.

  1. Bir sonraki çalıştırma, bir önceki çalıştırma bitmeden önce başlarsa (örneğin, komut dosyası yeniden mi giriyor?) veya

  2. Bir çalışma doğru şekilde tamamlanamazsa veya

  3. Bir sonraki çalıştırma hiç veya tam zamanında başlamazsa (örneğin, bir sonraki çalıştırmanın başlatılması gerektiğinde makine kapalıysa ne olur) ve

  4. başarısız veya başarılı çalışmaların günlüğe kaydedilmesi ve raporlanması hakkında.


Bu benim göz önünde bulundurmadığım bir yaklaşımdı - ve bir filesonraki atçalışmayı içeriyorsa, özyinelemeli yapılabilir mi?
warren

harika - sadece denedim ve harika çalışıyor :)
warren

2
+1, fakat dikkate alınması gereken birkaç şey: at-komut ilk satırsa ve komut dosyası uzun süre çalışıyorsa (veya aralıklar kısa ise), aynı anda birden fazla örnek çalıştırmaya dikkat edin. Ancak at, betiğin son satırındayken, komut dosyası başarısız olursa, hiçbir zaman çizelgeleme yapılmayacaktır. Ayrıca, betiği komut satırından çalıştırmak onu (yeniden) da zamanlayacaktır (ve: aynı anda çoklu zamanlamalar olabilir). Ve cronherhangi bir hata göndermeyi (veya: genel olarak çıktı alındığında) e-postayla göndermeyi destekler; atBöyle bir şey olup olmadığını bilmiyorum ?
Arjan

@Arjan - O - Ben sadece benim iş istasyonu :) ..however eğlenmek için kullanıyorum (şu anda) beri .. bana bir e-posta gönderme başarısız olup hakkında çok endişeli değilim IS düşünülmesi gereken bir konu eğer bu genişletilmişse, örneğin, izinsiz giriş tesadüfi bir kontrol için
warren

Tahmin ettiğim senaryo, bir defada kaç tane kopya çalıştığını önemsemez
warren

13

Her türlü şeyi yapan / etc / crontab'da birçok komut var ve saniyeler içinde hassasiyete ihtiyaç var. Şimdi cron, her zaman görünür ve merkezileştirilmiş olurken daha iyi bir çözünürlüğe sahip olabilir.

Bu örnek, her 5 dakikada bir 10 ila 50 saniye arasında bir web sayfası alır ve ayrıştırır:

4-59/5 * * * * root (sleep $(($RANDOM\%40+10))) && /etc/munin/plugins/someplugin prefetch

Veriler yavaş hareket ettiğinden kesin bir zamana sahip olmak zorunda değildir, ancak web sayfaları için beklemek zorunda kalmadan muninod düğümü yürütme süresini mümkün olduğunca düşük tutmaya yardımcı olur. (Eklenti, gereksiz isabetleri azaltmak için sayfayı 30 dakika önbelleğe alır, ancak her 5 dakikada bir veritabanını güncellemesi gerekir).

\% - cron, "\ n" yerine% 'nin yerini alır - posta metnini bir satırda tutmak için kullanışlıdır.


Web sayfalarını önbelleğe alıyorsanız, kesin yükleme sonuçları almanız gerekmez
warren

1
evet, biliyorum - 'veri yavaş ilerliyor' - eklenti bir siteden döviz kurları alıyor ve yasaklanmasını istemiyorum. (Bir tüccar değilim ama munin grafiklerini izlemek zorunda kaldığım için çok zaman harcıyorum) Yerel hava durumu için benzer bir eklenti yaptım. Sonsuz uygulamalar!
Andy Lee Robinson,

1
Aha! .. çok havalı bir yaklaşım :)
warren

6

Dahili olarak cron, böyle bir özelliğin olduğunu sanmıyorum. Bence en iyi çözüm, komutunuzu bir kabuk betiğine yerleştirmek sleepve betiğin en üstüne rastgele bir aralık koymak ve $RANDOMdeğişkeni kullanmak olacaktır . Ardından senaryoyu günde bir kez normal bir cron işinde çalıştırın.

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

1
sleep (), servis sağlayıcı tarafından öldürülecek bir garantidir. Tabii ki, o servis sağlayıcısı IS.
Cüce

1
Birinin tesadüfen servet sunması hes eğer Linux kendi makinesinde ya da bir şey olduğunu varsayıyordum
John T

iyi, bu doğru.
Bir Cüce

Neden uyumak kötü bir fikir? Sadece soruyorum ...
Tadeusz A. Kadłubowski

@John T
warren

6

Ne tür aralıklarla takip ettiğinize bağlı olacaktır. ancak betiğin 1: 30 olasılıkla (30 dakikada bir) rasgele çalışmasını istediğinizi varsayalım.

  • Cron betiğinizi 10 dakikalık bir süre için oluşturun. Her 30 dakikada bir 3 kez ateş eder.

  • Betik içinde bir if ifadesinin koşulu olarak rand kullanın . Rand'ın 0 ile 2 arasında bir sayı döndürmesini istiyorsunuz. 0 ise, if ifadesinin içeriğini yürütün.

Temel olarak, komut dosyanız her zaman belirli bir aralıkta çalışır. Ancak sadece ilgilendiğiniz komutu rastgele çalıştıracaktır. Servis sağlayıcınız size teşekkür edecek.


@A Cüce - Bu fikir için teşekkürler, çok - Biraz sık ama yarı-rastgele temeli üzerinde müdahalelerine vb denetlemek istiyorsa bu biraz daha yararlı rota olacağını
warren
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.