2010-01-17 14 views
16

Attualmente sto scrivendo un'applicazione che richiama nuove informazioni da fonti RSS e deve aggiornare tali sorgenti RSS in una certa frequenza. Attualmente sto tirando solo quando l'utente richiede un feed ma voglio cambiare quel comportamento al recupero periodico automatico.Attività ricorrenti in un'applicazione Ruby On Rails: Cron o altro?

Stavo scrivendo uno script di shell che interagirebbe con il database e viene avviato periodicamente tramite cron - ma questo è un sacco di doppio sforzo, quindi mi chiedevo quale sarebbe stato il "Rails Way" o "Ruby Way" per farlo. Sto usando Ubuntu, Apache e Passenger. Puoi suggerire metodi migliori magari inclusi anche nell'applicazione, così posso facilmente distribuire l'app su un'altra macchina senza dover mischiare con cron?

risposta

19

Vorrei suggerire di fare qualcosa di simile a un compito rastrello e utilizzando il whenever gem per generare il vostro lavoro cron per eseguire l'attività rake.

Partenza, http://railscasts.com/episodes/164-cron-in-ruby, per ulteriori informazioni sulla gemma whenver.

Il vantaggio principale della whenever gem è che mantiene i requisiti di applicazione (vale a dire il lavoro cron in esecuzione ogni x ore, nell'applicazione) all'interno della vostra applicazione, aumentando la portabilità dell'applicazione.

1

Ci sono una varietà di soluzioni. Per la configurazione più semplice, è possibile utilizzare script/runner in qualcosa di crontab in questo modo:

10 0 * * * /home/myuser/myproject/script/runner -e production ModelName.methodname 

methodName deve essere un metodo statico del modello. È necessario fare riferimento al progetto per il percorso completo, altrimenti non sarà trovato molto probabilmente nell'ambiente cron. Controlla la tua pagina man crontab per informazioni sulla sintassi crontab se non ti è familiare. Quanto sopra, ad esempio, esegue la sceneggiatura al decimo minuto della 0a ora di ogni giorno (alle 12:10, in breve).

Se è necessaria una soluzione più potente, è possibile utilizzare BackgroundRB. BackgroundRB esegue un daemon e supporta attività pianificate e può inserire risultati in un database. Dispongono anche di un semplice protocollo di comunicazione per consentire ai processi Web di richiedere il completamento di un'attività e quindi di recuperare i risultati. Ciò consente di controllare i lavori in background direttamente dall'interfaccia web, piuttosto che un crontab che "accade".

C'è un bel po 'di più l'installazione necessaria per BackroundRB al lavoro, ma può valere la pena se i lavori devono essere controllati.

6

Suggerisco una combinazione dei due sopra. Desideri un'attività rake, anche se hai già creato un metodo diretto. Questo perché roba di amministrazione del server che si vorrebbe eseguire in cron, si potrebbe anche voler eseguire dalla riga di comando di tanto in tanto, e questo è ciò che le attività di rake sono buoni.

Il plug-in quando sembra interessante, anche se non posso garantire per questo. Certo, è bello sapere come fare le cose da zero, quindi utilizzare i plugin per semplificarti la vita. Ecco il modo da zero.

Creare un nuovo file, lib/tasks/admin.rake

All'interno, creare l'attività in sé:

namespace :admin 
    desc "Updates all RSS feeds" 
    task :rss => :environment do 
    RssFeed.update_all 
    end 
end 

Questo presuppone che una classe di RSS feed, e il metodo update_all fa quello che ci si aspetterebbe.È possibile chiamare questo dalla riga di comando:

rake admin:rss 

E si può aggiungere questo ai cron (chiamando crontab -l come l'utente web) e aggiungendo questa linea:

10 0 * * * cd /path/to/rails/app && rake RAILS_ENV=production admin:rss 
+1

È un buon punto sapere come fare le cose manualmente. Il vantaggio principale di When Gem, anche se, come ho sottolineato sopra, non è solo la sintassi di scrivere un pulitore di cron job, a causa del dsl che usa, ma consente di mantenere quel requisito aziendale (il cron job), nel controllo della versione con la tua applicazione, in questo modo quando arriva il momento di scalare, non devi andare a caccia attraverso la scheda cron, copiando la scheda cron, filtrando altri processi cron non correlati alla tua app, cambiando percorsi, ecc. È possibile generare le aggiunte al crontab con la gemma. – Travis

+0

Sono assolutamente d'accordo, e farò sicuramente checkout per me! Hai ragione, i crons previsti * dovrebbero * essere parte dell'applicazione, inclusi nel controllo della versione, ecc. Ho solo pensato di contribuire con un po 'di fondamento. –

1

Prova utilizzando whenever. Alla fine, verrà creato un cron, ma la definizione della pianificazione verrà scritta all'interno dell'applicazione utilizzando Ruby DSL.

0

Per piccole squadre e progetti personali, la gemma ogni volta che è grande. Ma se la tua azienda ha un team operativo separato dal team di sviluppo, potrebbe non essere l'ideale.

Al mio ultimo lavoro, il team operativo doveva essere in grado di vedere il cron che stavamo installando in modo da essere sicuri che non avrebbe avuto effetti collaterali per il sistema. Quindi una soluzione DSL non avrebbe funzionato. Ma noi (gli sviluppatori) volevamo gli script di cron nel controllo della versione.

Così al compromesso, abbiamo controllato i file di testo con il cron grezzo, simile a questo:

10 0 * * * cd /path/to/rails/app && rake RAILS_ENV=production admin:rss 

E abbiamo aggiunto un passo allo script Capistrano che ha installato che al crontab come parte del deploy.

+1

Quando si digita ogni volta che si trova nell'applicazione rails, emette i lavori cron. Non potresti semplicemente produrre i lavori in un file per il team ops da guardare? – ericraio

0

Prova l'installazione di webmin sul tuo server. Se il tuo sito ospitato lo fornisce. Vai all'URL indicato di seguito. È facile da configurare e da usare gratuitamente.

URL è:

http://your_ip_address:10000/ 

Ho usato questo in molti della mia applicazione ha funzionato per me per pianificare i processi cron.