Esegui codice ogni ora [chiuso]

8

Ho bisogno di creare un servizio web che venga eseguito ogni ora. Verrà utilizzato per esaminare i dati in un database e aggiungere avvisi a una tabella nello stesso database se vengono soddisfatte determinate condizioni / non soddisfatte. Quello che abbiamo attualmente è:

Abbiamo dispositivi finali che utilizzano Python per segnalare a un server virtuale Amazon Web Services (AWS). Il server AWS acquisisce tali informazioni e le archivia in un database MySQL. Il server AWS è Linux che esegue Django e Apache. Devo essere in grado di eseguire un codice Python ogni ora che verifica i dati che sono stati archiviati dai dispositivi finali. Se determinate condizioni non vengono soddisfatte, verrà aggiunto un record alla tabella alerts nel database.

Inizialmente avevamo contratto per creare la configurazione sopra descritta. Sono nuovo di Python, Django e Apache. Tuttavia, ho già apportato diverse modifiche al codice Python che invia e riceve anche i dati dai dispositivi finali. Sono un programmatore che sta entrando nella programmazione web.

Qualcuno ha qualche consiglio su come posso farlo?

    
posta Linger 24.10.2012 - 16:24
fonte

6 risposte

31

Che ne dici di fare un cronjob , assumendo che tu abbia accesso alla shell?

Il daemon cron esiste praticamente su qualsiasi sistema simile a UNIX e pianifica i comandi da eseguire in base a una descrizione in un file chiamato crontab .

Ogni riga del file contiene un insieme di campi per indicare i punti temporali quando un comando deve essere eseguito.

Il tuo compito potrebbe essere un programma autonomo che esegue l'attività che desideri o come suggerisce un'altra risposta, un'invocazione di un client HTTP come wget , curl o recupera per accedere a una risorsa Web che eseguirà l'azione.

Se hai dei limiti per quanto tempo può richiedere una richiesta di pubblicazione, potresti dover spostare l'attività in uno script o un programma offline che non viene eseguito all'interno del tuo framework / server web.

    
risposta data 24.10.2012 - 16:31
fonte
17

Con Django su AWS, esaminerei Celery .

Celery aggiunge attività asincrone e include uno scheduler e su AWS puoi configurare Celery per utilizzare il Amazon Simple Queue Service come il broker (vedi Celery con Amazon SQS su Stack Overflow e questo post sul blog sull'argomento).

Hai impostato una pianificazione periodica dei compiti di Celery ed eseguirà una configurazione compito secondo quel programma.

Il vantaggio è che puoi utilizzare l'intera configurazione per eseguire qualsiasi attività asincrona, scaricando pesanti attività dal tuo server web ai lavoratori di Celery.

L'alternativa leggera è quella di impostare un lavoro crontab; puoi persino configurare una rotta nella tua applicazione Django da chiamare usando curl o wget :

* 5 * * * curl http://username:password@hostname/route_to_job
    
risposta data 24.10.2012 - 16:36
fonte
7

Poiché la tua istanza AWS esegue Linux, puoi probabilmente farlo come un cron lavoro .

Potresti prendere quello che definirei l'approccio cron di Drupal che, nel caso di Django, implica la creazione di un controller per rispondere a un URL e quindi esegui l'azione desiderata.

Quindi configuri un'attività cron in curl dell'URL del controller, attivando lo script.

Questo ha il vantaggio di essere facilmente richiamabile in qualsiasi momento da un URL: forse un gestore impaziente vuole un report generato da dati degli ultimi 20 minuti.

    
risposta data 24.10.2012 - 16:38
fonte
3

Potresti voler esaminare APScheduler. Questo è uno schedulatore a quarzo (sebbene non così esteso) per Python.

Questa può essere un'alternativa di gran lunga migliore agli script di cron eseguiti esternamente per applicazioni di lunga durata (ad esempio applicazioni web), poiché è neutrale rispetto alla piattaforma e può accedere direttamente alle variabili e alle funzioni dell'applicazione.

Puoi trovare una descrizione per la versione più recente qui: link

C'è qualche documentazione per l'installazione / implementazione qui: link

Ecco alcune delle caratteristiche:

  • Nessuna dipendenza (difficile) esterna
  • API thread-safe
  • Eccellente copertura del test (testato su CPython 2.5 - 2.7, 3.3, Jython 2.5.3, PyPy 1.9)
  • Meccanismi di pianificazione configurabili (trigger):
    • Pianificazione cron come
    • Pianificazione ritardata di lavori a esecuzione singola (come il comando "at" di UNIX)
    • Basato su intervalli (eseguire un lavoro a intervalli di tempo specificati)
  • Memorie di lavoro multiple e simultaneamente attive:
    • RAM
    • Database semplice basato su file (shelve)
    • SQLAlchemy (qualsiasi RDBMS supportato funziona)
    • MongoDB
    • Redis
risposta data 24.10.2012 - 20:04
fonte
1

Penso che puoi utilizzare alcune cose come django-extensions

sito web Django-Extensions

C'è un modulo - lavori. Per me questo è un ottimo strumento per controllare i tuoi cronjob.

La seconda opzione è usare una stoffa e creare una funzione per questo.

E vedo la terza strada. Usa la tua immaginazione e conoscenza e crea la tua funzione con sottoprocesso e sh.

    
risposta data 24.10.2012 - 17:41
fonte
1

Probabilmente la risposta qui è che stai usando crontab con l'impostazione predefinita che significa che sta visualizzando il crontab SPOOL RATHER THAN THE FILES.

Nel frattempo, può essere eseguito anche in AWS in quanto è fornito con cron preinstallato e configurato, che consente di impostare un'attività che deve essere eseguita ogni ora, giornalmente, settimanalmente o mensilmente, così come ogni altro periodo di tempo da mettere i file in una directory /etc/cron.xxxxxx come spiegato qui .

Impostare un lavoro da eseguire ogni ora, giornalmente, settimanalmente o mensilmente è molto veloce. Poiché la domanda è come chiedere di eseguire il codice ogni ora così in AWS Linux puoi creare un file in /etc/cron.hourly .

Ecco il passo in cui hai effettuato il login nella tua istanza tramite il client SSH.

$ echo "/usr/bin/python -q /path/to/your/file" > application
$ sudo mv application /etc/cron.hourly/
$ sudo chown -R root /etc/cron.hourly
$ sudo chmod 2755 /etc/cron.hourly/application
$ sudo /etc/init.d/crond restart

Nell'esempio sopra il file salvato e denominato 'applicazione'. Il nome non è importante purché sia unico. Questo è il rapporto del registro eseguito: $ sudo vim /var/log/cron

Dec 28 19:01:01 ip-xxx-xx-xx-xx CROND[20243]: (root) CMD (run-parts /etc/cron.hourly)
Dec 28 19:01:01 ip-xxx-xx-xx-xx run-parts(/etc/cron.hourly)[20243]: starting 0anacron
Dec 28 19:01:01 ip-xxx-xx-xx-xx run-parts(/etc/cron.hourly)[20261]: finished 0anacron
Dec 28 19:01:01 ip-xxx-xx-xx-xx run-parts(/etc/cron.hourly)[20243]: starting application
Dec 28 19:01:02 ip-xxx-xx-xx-xx run-parts(/etc/cron.hourly)[20323]: finished application

Come mostrato nel log, alle base oraria inizierà a correre anacron che esegue periodicamente la pianificazione dei comandi che viene tradizionalmente eseguita da cron e quindi chiama ogni altro file nella directory ed esegui i comandi in ogni file.

    
risposta data 28.12.2015 - 20:43
fonte

Leggi altre domande sui tag