Come eseguire un comando una volta completato lo scrub ZFS *?


11

Vorrei usare cron per pianificare gli scrub periodici del mio pool ZFS e, in tempi ragionevolmente brevi dopo il termine dello scrub , inviare a me stesso un rapporto sullo stato. Lo scopo è quello di individuare eventuali problemi senza doverli cercare manualmente (push anziché pull).

La prima parte è semplice: basta impostare un cron job da eseguire zpool scrub $POOLcome root a qualunque intervallo sia ragionevole nella mia situazione particolare.

La seconda parte, non sono così sicuro di come fare. zpool scrubritorna immediatamente e quindi lo scrub viene eseguito in background dal sistema (che è certamente un comportamento desiderabile se lo scrub viene avviato da un amministratore da un terminale). zpool statusmi dà un rapporto sullo stato ed esce (con il codice di uscita 0 mentre lo scrub è in esecuzione; non è ancora terminato, quindi non so se lo stato di uscita cambia una volta terminato, ma ne dubito). L'unico parametro documentato per zpool scrub è -s"stop scrubbing".

Il problema principale è rilevare il cambio di stato dalla pulizia alla pulizia finale . Detto questo, il resto dovrebbe andare a posto.

Idealmente, vorrei dire zpool scrubdi non tornare fino al termine dello scrub, ma non vedo alcun modo per farlo. (Sarebbe quasi troppo semplice semplicemente cron zpool scrub --wait-until-done $POOL; zpool status $POOL.)

In caso contrario, vorrei chiedere al sistema se è attualmente in corso uno scrub, preferibilmente in un modo che non rischia troppo di rompersi con un aggiornamento o una modifica della configurazione, in modo da poter agire sul fatto che in precedenza scrub è terminato (eseguendo uno stato zpool quando lo stato scrub passa da scrubbing a non scrubbing).

Questa particolare configurazione è per un sistema di workstation, quindi mentre uno strumento di monitoraggio come Nagios probabilmente ha componenti aggiuntivi che potrebbero risolvere il problema, è piuttosto eccessivo installare tale strumento solo per questa attività. Qualcuno può suggerire una soluzione a bassa tecnologia al problema?

Risposte:


13

Su ZFS Su Linux , a partire dalla versione 0.6.3, questo può essere gestito in modo abbastanza elegante usando il Demone eventi ZFS (zed). Il daemon degli eventi, in virtù del monitoraggio diretto degli eventi del kernel, può reagire quasi immediatamente a tutti gli eventi che si verificano e non dipende dal polling e dall'analisi continui dell'output di altri comandi.

Creare uno script di shell con qualsiasi nome di file che inizia con /etc/zfs/zed.d/scrub.finish(ad esempio, scrub.finish-custom.sh). Tale script può eseguire qualsiasi azione appropriata, come l'invio di un'e-mail, la scrittura di una voce di registro da qualche parte o il modo in cui il sistema canta e balla (OK, forse non quello). Vengono forniti esempi che possono fornire un punto di partenza.

Se tutto ciò che desideri è ricevere un'e-mail al termine dello scrub, lo scrub.finish-email.shscript fornito lo farà bene. È sufficiente modificare /etc/zfs/zed.d/zed.rc per indicare dove deve essere inviata l'e-mail e se inviare un'e-mail anche se il pool non presenta alcun problema, assicurarsi che qualcosa di nome scrub.finishseguito da qualcosa in / etc /zfs/zed.d conduce ad esso e assicurarsi che zed sia avviato all'avvio.



3

Sebbene questa domanda sia specifica per Linux, è il primo risultato di Google quando si cerca "aspetta fino al termine dello scrub" , quindi vorrei aggiungere alcune informazioni utili per le persone che eseguono OpenSolaris (testato su OmniOS, ma SmartOS, illumos ecc. dovrebbe essere simile) invece di Linux (dovrebbe funzionare anche Solaris normale, ma non l'ho provato lì).

È possibile utilizzare syseventadmper registrare eventi del kernel. L'elenco completo è disponibile in /usr/include/sys/sysevent/eventdefs.h(basta cercare "ZFS" in questo file). Dopo aver aggiunto eventi, è necessario riavviare il servizio, ad esempio:

syseventadm add -c EC_zfs -s ESC_ZFS_scrub_finish /path/to/script.sh \$pool_name
syseventadm restart

In questo modo, lo script verrà avviato al termine di qualsiasi lavaggio di qualsiasi pool: è necessario verificare all'interno dello script se è $1uguale al nome del pool desiderato. Tuttavia, è molto meno sovraccarico del polling.


2

Uso questo semplice script per cancellare i rapporti sullo stato via e-mail.

Se è necessario rilevare la transizione da scrub runninga scrub finished, verificherei il statecampo di zpool statusoutput. Qualcosa come questo:

# start scrubbing 
zpool scrub ZPOOL

# wait till scrub is finished
while zpool status ZPOOL | grep 'scan:  *scrub in progress' > /dev/null; do
   echo -n '.'
   sleep 10
done

# send a report
zpool status | mail -s "zpool status: ZPOOL" RECIPIENT

Ho guardato il codice, ma sembra che ti dia lo stato solo quando lo script è in esecuzione. Come mi avviserebbe quando lo stato passa da "scrubbing" a "finito"?
un CVn

@ MichaelKjörling lo script non finirà fintanto che lo scrub è in corso a causa del while ... donecontrollo del ciclo proprio per questa condizione.
the-wabbit,

Penso che qualcosa del genere sia il modo in cui andrò. A proposito, grep -qdovrebbe funzionare anche nello snippet di script della shell, negando la necessità di reindirizzare a / dev / null. :)
un CVn il

Sì, l'ho provato su Solaris 10 con POSIX grep che non ha questa opzione.
dsmsk80,

Ah ok. Però GNU grep ha -q con la semantica desiderata.
un CVn del

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.