SORU
17 Aralık 2008, ÇARŞAMBA


Nasıl Python zamanlayıcı gibi bir Cron alabilirim?

İşlevler at cron sağlayacak Python içinde bir kütüphane arıyorum.

Oldukça saf Python gibi bir çözüm, alet kutusu üzerinde yüklü güvenerek daha olurdu; bu şekilde hiçbir cron ile makine üzerinde çalıştırmak.

Görevleri bir ifade gibi dayalı zamanlayabilirsiniz: . o cron aşina olmayanlar için:

 0 2 * * 7 /usr/bin/run-backup # run the backups at 0200 on Every Sunday
 0 9-17/2 * * 1-5 /usr/bin/purge-temps # run the purge temps command, every 2 hours between 9am and 5pm on Mondays to Fridays.

Cron zaman ifade sözdizimi daha az önemlidir, ancak esneklik ile bu tür bir şey istiyorum.

Eğer bunu benim için out-the-box olan bir şey değil eğer yok, bu bina için herhangi bir öneriniz bu minnetle olurdu gibi bir şey aldı yapmak için engeller.

Edit İşlemler, sadece "iş" de Python - python fonksiyonları. yazılı başlatılması ilgilenmiyorum Mecburiyetten bu farklı bir konu, ama farklı bir işlem değil bence.

Bu amaçla, Python anlatımcılık cron zaman ifadesi için, ama iş arıyorum.

Cronvardıryıllardır, ama mümkün olduğunca taşınabilir olması için çalışıyorum. Edemem varlığını güveniyor.

CEVAP
17 Aralık 2008, ÇARŞAMBA


Sadece normal Python değişken geçen sözdizimi crontab belirtmek için kullanabilirsiniz. Örneğin, bir Olay sınıfı aşağıdaki gibi tanımlamak varsayalım:

from datetime import datetime, timedelta
import time

# Some utility classes / functions first
class AllMatch(set):
    """Universal set - match everything"""
    def __contains__(self, item): return True

allMatch = AllMatch()

def conv_to_set(obj):  # Allow single integer to be provided
    if isinstance(obj, (int,long)):
        return set([obj])  # Single item
    if not isinstance(obj, set):
        obj = set(obj)
    return obj

# The actual Event class
class Event(object):
    def __init__(self, action, min=allMatch, hour=allMatch, 
                       day=allMatch, month=allMatch, dow=allMatch, 
                       args=(), kwargs={}):
        self.mins = conv_to_set(min)
        self.hours= conv_to_set(hour)
        self.days = conv_to_set(day)
        self.months = conv_to_set(month)
        self.dow = conv_to_set(dow)
        self.action = action
        self.args = args
        self.kwargs = kwargs

    def matchtime(self, t):
        """Return True if this event should trigger at the specified datetime"""
        return ((t.minute     in self.mins) and
                (t.hour       in self.hours) and
                (t.day        in self.days) and
                (t.month      in self.months) and
                (t.weekday()  in self.dow))

    def check(self, t):
        if self.matchtime(t):
            self.action(*self.args, **self.kwargs)

(Not: iyice test Değil)

Daha sonra CronTab normal python sözdizimi olarak belirtilebilir

c = CronTab(
  Event(perform_backup, 0, 2, dow=6 ),
  Event(purge_temps, 0, range(9,18,2), dow=range(0,5))
)

Bu şekilde Python savı mekaniği tam güç (konum ve anahtar kelime argümanlar karıştırma, hafta ve ay adları için sembolik isimler kullanırlar)

CronTab sınıfı sadece dakikalık aralıklarla uyuyor ve onay arama gibi tanımlanmış olacaktır() her olay. (Muhtemelen / saat) ama dikkatli olmak dilimleri gün ışığından yararlanma ile bazı incelikleri vardır. Burada hızlı bir uygulama:

class CronTab(object):
    def __init__(self, *events):
        self.events = events

    def run(self):
        t=datetime(*datetime.now().timetuple()[:5])
        while 1:
            for e in self.events:
                e.check(t)

            t  = timedelta(minutes=1)
            while datetime.now() < t:
                time.sleep((t - datetime.now()).seconds)

Bir kaç şey not: Python bu hafta / ay olan sıfır indeksli (aksine cron) ve bu dizi hariç son öğe, bu yüzden sözdizimi gibi "1-5" haline gelir aralığı(0,5) - yani [0,1,2,3,4]. Eğer cron sözdizimi tercih ediyorsanız, ayrıştırma ancak çok zor olmamalı.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Marques Brownlee

    Marques Brow

    21 Mart 2008
  • RiverCityGraphix

    RiverCityGra

    6 Ocak 2012
  • Titan Lee Hai

    Titan Lee Ha

    14 Temmuz 2008