Gå til innhold

Lage et Pythonskript som kan legge til cronjobber


Anbefalte innlegg

Videoannonse
Annonse
Er det noen som kjenner til en sånn implementasjon? Eventuelt vet korleis ein kan få restarta cron når eg har fått lagt endringer til filen?

 

Er det ikke mye enklere å:

 

a) Bare ha ett python-script som kjører hele tiden og starter hva du vil, når du vil?

 

eller

 

b) Ha ett Python script som kalles fra cron, sjekker om noe skal kjøre, og så starter det?

 

Da kan du jo ha styring selv, på hvordan vis du vil?

 

Ikke slemt ment, men virker som om du muligens prøver å løse rett problem på feil måte. Kan du si litt mer om hva det er du egentlig skal gjøre?

Lenke til kommentar
Grunnen til dette er at det skal være enkelt å legge til cronjobber via ein webside ;)

 

Men må det være cron da?

 

Script-basert redigering av ellers statiske filer er ofte litt herk. Dersom filen parses inn og redigeres risikerer man konflikt med manuell redigering, dersom man bare skriver filen fra en database overskriver man gjerne andreting osv osv.

 

Tror jeg heller ville latt websiden redigere en database, og så enten hatt en daemon som plukket opp jobber derfra, eller fått crontab til å starte ett program, som kjørte alle jobber som var due, og så quitter.

Lenke til kommentar
Tror jeg heller ville latt websiden redigere en database, og så enten hatt en daemon som plukket opp jobber derfra, eller fått crontab til å starte ett program, som kjørte alle jobber som var due, og så quitter.

 

Du liker jo PostgreSQL hvis jeg ikke husker feil...

 

Hva med følgende?

 

Lag en tabell over jobber, som også har den informasjonen du vil om tidspunkt/frekvens etc.

 

Hver gang det gjøres en endring, så trigges en NOTIFY.

 

Da kan du ha en liten daemon, som LISTENer på dette, og re-kalkulerer når neste jobb skal kjøres.

 

Hver gang den enten får en event via LISTEN, eller kjører neste event, så sjekker den nestegang den skal kjøre noe, og sover til da.

Lenke til kommentar

Dette er nok litt meir komplekst samtideg som det skal være enklast mogleg for brukeren.

 

Brukeren skal kunne velge eit python skript som skal utføre diverse handlinger på eit valgt tidspunkt. Dette kan være å sende e-post eller skru av andre maskiner, starte opp maskiner, hente ned data basert på timeplan osv. Brukeren er aldri borti redigering av filer.

 

Dei handlingane som skal skje, skal ikkje alltid skje, timeplanen for handlingane er ikkje meir enn ca 1-2 veker fram i tid. Det er nok mogleg å implementere dette med Python og PostgreSQL, men det må jo være unaudvendig komplekst.

Lenke til kommentar

Har du sett på django-cron?

 

Ellers blir nok det enklaste i ditt tilfelle å definere nokre moduler som snakkar med ei SQLite-database eller liknande, for å så linke desse jobbane saman opp mot ein daemon.

 

Eit anna alternativ (som eg hadde gått for) er å bruke Gearman som ein meldingsserver. Du kan da definere funksjoner som serveren skal køyre. Bruk dette i samsvar med ei database som definerer tidsromma dei forskjellige jobbane skal køyre, og du har ei relativt ressursbesparande og god løysing.

 

Å bygge sitt eige køsystem er også eit alternativ. Eg har f.eks. satt opp eit spesielt køsystem med Erlang, memcached og Python, som har moglegheita til å bearbeide 14.000 meldinger i sekunder på ein Intel Quad Core. Men det blir vel kanskje litt overkill for dette prosjektet?

 

Eg vil iallfall anbefale følgjande:

  • Definer modulane dine i klasser. (Baseklasse som definerer funksjonaliteten, alle jobb-klasser har denne som utgangspunkt)
  • Eksponer desse modulane på ein enkel måte for brukarane
  • Lagre brukaralternativa i databasen
  • Ha ein crontab som sjekker kva som er aktuelt å gjere ved visse tidsintervaller
  • Send jobbeskrivelsen til Gearman for bearbeiding

Her er eit lite eksempel på baseklassen:

import datetime

class NotImplemented(Exception):
pass

class BaseJob(object):
""" BaseJob. Jobs must run hourly """
def __init__(self, job_name, hour=15):
	self.job_name = job_name
	self.hour = hour

def should_run(self):
	""" If the server hour is the same as the BaseJob's hour, return True """
	if datetime.datetime.now().hour == self.hour:
		return True
	return False

def execute_job(self):
	raise NotImplemented(), 'Implement in subclass'

 

Så subklasser du berre denne. Eks:

class EmailJob(BaseJob):
def execute_job(self, email):
	return send_email('Emne', 'Body', email, '[email protected]')

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...