Come pianificare i lavori del server in modo più intelligente rispetto a cron?


15

Eseguo un lavoro ogni minuto per reindicizzare i contenuti del mio sito.

Oggi il motore di ricerca è morto e quando ho effettuato l'accesso c'erano centinaia di processi orfani avviati da cron.

Esiste un altro modo per utilizzare un qualche tipo di software esistente che mi consentirà di eseguire un lavoro ogni minuto, ma che non avvierà un'altra istanza se quel lavoro non viene restituito (ovvero perché il processo del motore di ricerca non è riuscito)?


4
cron probabilmente sta facendo esattamente quello che stai dicendo. Suggerisco invece di riscrivere il lavoro in modo intelligente.
gparent

Risposte:


27

Il problema non è proprio con cron: è con il tuo lavoro.

Dovrai far interagire il tuo lavoro con un lucchetto di qualche descrizione. Il modo più semplice per farlo è tentare di creare una directory e in caso di successo continuare, se non uscire. Quando il lavoro è terminato ed esce, dovrebbe rimuovere la directory pronta per la prossima esecuzione. Ecco una sceneggiatura da illustrare.

#!/bin/bash

function cleanup {
    echo "Cleanup"
    rmdir /tmp/myjob.lck
}

mkdir /tmp/myjob.lck ||  exit 1
trap cleanup EXIT
echo 'Job Running'
sleep  60
exit 0

Esegui questo in un terminale quindi prima che siano trascorsi 60 secondi eseguilo in un altro terminale uscirà con lo stato 1. Una volta terminato il primo processo puoi eseguirlo dal secondo terminale ...

MODIFICARE:

Appena ho saputo del gregge ho pensato di aggiornare questa risposta. flock (1) può essere più facile da usare. In questo caso flock -nsembrerebbe appropriato ad es

* * * * * /usr/bin/flock -n /tmp/myAppLock.lck /path/to/your/job   

Avrebbe eseguito il tuo lavoro ogni minuto ma non sarebbe riuscito se flock non fosse riuscito a ottenere un blocco sul file.


2
Domanda stupida forse, ma ci sono dei vantaggi nell'usare una directory in modo specifico piuttosto che un normale file?
gparent

9
L'uso di un file normale richiede diverse operazioni, controlla se esiste, se non lo crea, quindi. Questo lascia una finestra di opportunità per un altro processo per creare il file - disordinato. Il mkdir è un'operazione atomica o funziona e ottieni il 'lock' o non lo fa come già ha un altro processo.
utente9517

Ha senso. Buona idea anche sulla directory di blocco. Grazie
John

2

Un modo sarebbe far sì che il tuo script reindex crei un file di blocco in modo che possa verificare se esiste già un'istanza dello script in esecuzione. Puoi anche aggiungere una gestione delle eccezioni per vedere se il motore di ricerca è attivo e funzionante.

Un'alternativa più coinvolta sarebbe quella di utilizzare una sorta di queuer di attività come Resque e Resque-scheduler:

https://github.com/blog/542-introducing-resque

https://github.com/bvandenbos/resque-scheduler#readme

C'è anche Qu e Sidekiq:

https://github.com/bkeepers/qu

https://github.com/mperham/sidekiq

Sì, è tutto orientato a Ruby, ma puoi cercare "cose ​​come resque" nella lingua che preferisci.


0

Un altro modo per impostare rapidamente questo è avviare uno script di shell all'avvio della macchina (cron può farlo con ' @reboot /path/to/my/script.sh', quindi riavviare cron per avviarlo) con qualcosa di simile al suo interno.

#!/bin/sh
/opt/bin/run-site-index
sleep 60
exec $0

Lo script continua a funzionare ed è solo che ne hai iniziato uno, ecco quanti potrebbero essere in esecuzione contemporaneamente, non più di così. Alcuni esperti possono anche verificare se l'indicizzatore è in esecuzione e, in caso contrario, riavviare o tentare in altro modo di risolvere il problema.


-3

Invece di usare cron per questo, costruirei il tuo lavoro più come un servizio che gira in un ciclo e dorme per 60 secondi come l'ultimo passo, o forse dorme più spesso per intervalli più piccoli in vari punti durante il processo per aiutare a distribuire il carico più uniformemente.


1
Ciò non risolverebbe il problema né costituirebbe un miglioramento rispetto a cron.
gparent

Risolverebbe il problema, perché poi c'è un solo processo che viene eseguito in assoluto. Eviterebbe cron completamente.
Joel Coel,

Non risolve il problema se il "servizio" non appare se il motore di ricerca è in esecuzione. La sua sceneggiatura / la logica del lavoro è il problema. EDIT: In realtà, hai ragione, nasconderebbe il problema in modo brutto.
gparent
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.