2012-02-21 10 views
7

Un'esigenza molto comune per un'applicazione è eseguire uno script ogni X minuti/ora. Fondamentalmente non è niente di complicato, solo qualche codice PHP e una voce crontab.Cronjob - come fare nel modo giusto?

Anche se ho scritto un bel po 'di quei cronjobs negli ultimi anni non ho ancora visto nessuna migliori pratiche, almeno non più di tanto. Come per ogni "elaborazione in background", molte cose possono andare storte, specialmente nelle impostazioni di produzione.

Tra questi:

  • è verificato un errore durante l'esecuzione del cron e lo script è morto elaborazione metà dei dati
  • il cronjob è stato accidentalmente avviato due volte da un altro processo/da un errore dell'utente/qualunque cosa
  • il cronjob ha avuto modo in più tempo del previsto e lo script si chiama ancora una volta, anche se la sua non è fatto di elaborazione dati
  • ecc

Quali sono le migliori pratiche per scrivere script cronjob solidi e robusti? Scrivere un file di blocco affermando che solo un'istanza viene eseguita, una registrazione estesa e un monitoraggio in modo da impedire l'invio di decine di migliaia di e-mail duplicate? Quali sono le tue idee?

+0

Interessante che tu abbia postato questo perché ho fatto ricerche e mi sono chiesto alcune delle stesse cose. Nel mio caso, sono davvero preoccupato di come implementare in modo efficace la gestione delle eccezioni in uno script di shell che sto scrivendo. http: // StackOverflow.it/questions/6961389/exception-handling-in-shell-scripting ha alcune buone informazioni su questo nel caso tu sia curioso. Sono principalmente uno sviluppatore Java e la gestione delle eccezioni è molto robusto ma sembra più difficile nella terra * nix. –

+0

questo dipenderebbe da ogni singolo script che viene eseguito, non ci sono risposte generiche, alcuni hanno bisogno di errori molto robusti controllando alcuni non ne hanno bisogno ... –

+0

Ho inserito questa domanda in un segnalibro in previsione di risposte innovative con giustificazione dettagliata dei loro vantaggi e svantaggi, e sono piuttosto deluso dalle risposte "Questo è quello che faccio". – nickb

risposta

2

Personalmente, il modo in cui gestisco gli errori consiste semplicemente nell'inviare STDERR in un file di registro e quindi controllare periodicamente tale file. Un modo semplice per farlo è aggiungere 2>/pathtolog alla voce crontab.

Per quanto riguarda avere duplicati dello stesso programma in esecuzione, io preferisco avere il tentativo di script per bloccare qualcosa (un file o di una porta di rete locale). Se non riesce a ottenere quel blocco, lo script non viene eseguito. In questo modo, se uno script esistente è attualmente in esecuzione, uno nuovo non può ottenere il blocco identico.

0

Ci sono molte cose che puoi fare.

Impostare le script cron/binari (script immagino dal momento che lei ha citato sono scritti in PHP) per eseguibile dal proprietario o del gruppo a seconda delle esigenze.

Se si desidera assicurarsi che vengano eseguiti solo da cron, creare un utente cron che è l'unico utente in grado di eseguire lo script. Quindi imposta l'utente per eseguirlo nella tua voce crontab.

Nello script cron genera cose significative. Prepara il tuo output con un timestamp/datestamp (a seconda della frequenza con cui viene eseguito). Ciò semplifica l'uso di grep per determinati orari nel file di registro.

Appendi stdout del tuo script in un file di log da aggiungere >> /path/cron.log per la voce crontab.

È inoltre possibile generare l'ora di inizio e l'ora di fine del cronjob in modo da poter analizzare il registro ogni tanto per assicurarsi che non sia un processo troppo lento.

Il file di registro potrebbe essere simile:

[ Tue Feb 20, 2012 ]: 
[ Tue Feb 20, 2012 ]: Executing mycron.php 
[ Tue Feb 20, 2012 ]: 
[ Tue Feb 20, 2012 ]: Running Query: ""SELECT SUM(`clicks`) FROM `matable`"" 
[ Tue Feb 20, 2012 ]: Running Query: ""INSERT INTO `History` (`date`, `total_clicks`) VALUES(CURDATE(), 12324123) 
[ Tue Feb 20, 2012 ]: 
[ Tue Feb 20, 2012 ]: Finished executing mycron.php. Time taken: 3.462 seconds 
[ Tue Feb 21, 2012 ]: 
[ Tue Feb 21, 2012 ]: Executing mycron.php 
[ Tue Feb 21, 2012 ]: 
[ Tue Feb 21, 2012 ]: Running Query: ""SELECT SUM(`clicks`) FROM `matable`"" 
[ Tue Feb 21, 2012 ]: Running Query: ""INSERT INTO `History` (`date`, `total_clicks`) VALUES(CURDATE(), 10376123) 
[ Tue Feb 21, 2012 ]: 
[ Tue Feb 21, 2012 ]: Finished executing mycron.php. Time taken: 2.998 seconds 

Tranne fare tutto ciò che fa al posto di quei due query casuali, naturalmente.

+0

cronjob per controllare il log dell'altro cronjob, ma cosa succede se quello fallisce? –

Problemi correlati