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
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ı.
Nasıl Python iki değişken mantıksal xo...
:// protokolü şirketi tarafından engel...
Nasıl python geçerli idam dosyasının y...
Nasıl bir python betiği bir hizmet ya ...
Nasıl python'pprint yazdırmak yer...