Comment exécuter une commande une fois un nettoyage ZFS * terminé *?


11

Je voudrais utiliser cron pour planifier des nettoyages périodiques de mon pool ZFS, et à un temps raisonnablement court après la fin du nettoyage , m'envoyer un rapport d'état par e-mail. Le but de ceci est d'attraper les problèmes sans avoir à les chercher manuellement (pousser plutôt que tirer).

La première partie est simple: il suffit de configurer un travail cron pour qu'il s'exécute en zpool scrub $POOLtant que root à n'importe quel intervalle raisonnable dans ma situation particulière.

La deuxième partie, je ne sais pas trop comment faire. zpool scrubrenvoie immédiatement, puis le scrub est exécuté en arrière-plan par le système (ce qui est certainement un comportement souhaitable si le scrub est initié par un administrateur à partir d'un terminal). zpool statusme donne un rapport d'état et quitte (avec le code de sortie 0 pendant le scrub; il n'est pas encore terminé, donc je ne sais pas si l'état de sortie change une fois terminé, mais j'en doute). Le seul paramètre documenté pour zpool scrub est -spour "stop scrubbing".

Le problème principal est de détecter le changement d'état du nettoyage au nettoyage fini . Compte tenu de cela, le reste devrait se mettre en place.

Idéalement, je voudrais dire zpool scrubde ne pas revenir avant la fin du gommage, mais je ne vois aucun moyen de le faire. (Il serait presque trop facile de simplement cron zpool scrub --wait-until-done $POOL; zpool status $POOL.)

A défaut, je voudrais demander au système si un scrub est actuellement en cours, de préférence d'une manière qui ne risque pas trop de rompre avec une mise à niveau ou un changement de configuration, afin que je puisse agir sur l'exécution ou non d'un précédent le scrub est terminé (en exécutant un état zpool lorsque le statut du scrub passe du scrubbing au non scrubbing).

Cette configuration particulière est pour un système de poste de travail, donc même si un outil de surveillance tel que Nagios a probablement des compléments qui résoudraient le problème, il semble plutôt exagéré d'installer un tel outil pour cette seule tâche. Quelqu'un peut-il suggérer une solution moins technique au problème?

Réponses:


13

Sous ZFS Sous Linux , à partir de la version 0.6.3, cela peut être géré de manière assez élégante en utilisant le démon d'événement ZFS (zed). Le démon d'événements, en vertu de la surveillance directe des événements du noyau, peut réagir presque immédiatement à tous les événements qui se produisent et ne dépend pas de l'interrogation et de l'analyse en continu de la sortie d'une autre commande.

Créez un script shell avec n'importe quel nom de fichier commençant par /etc/zfs/zed.d/scrub.finish(par exemple, scrub.finish-custom.sh). Ce script peut prendre toute action appropriée, comme envoyer un e-mail, écrire une entrée de journal quelque part ou faire chanter et danser le système (OK, peut-être pas ça). Des exemples sont fournis qui peuvent fournir un point de départ.

Si tout ce que vous voulez, c'est recevoir un e-mail une fois le nettoyage terminé, le scrub.finish-email.shscript fourni le fera très bien. Modifiez simplement /etc/zfs/zed.d/zed.rc pour indiquer où l'e-mail doit être envoyé et si un e-mail doit également être envoyé si le pool ne rencontre aucun problème, assurez-vous que quelque chose est nommé scrub.finishsuivi de quoi que ce soit dans / etc /zfs/zed.d y mène et assurez-vous que zed est démarré au démarrage.



3

Bien que cette question soit spécifique à Linux, c'est le premier résultat google lors de la recherche de "attendre la fin du scrub" , donc je voudrais ajouter des informations utiles pour les personnes utilisant OpenSolaris (testé sur OmniOS, mais SmartOS, illumos, etc. . devrait être similaire) au lieu de Linux (Solaris normal devrait également fonctionner, mais je ne l'ai pas testé là-bas).

Vous pouvez utiliser syseventadmpour enregistrer les événements du noyau. La liste complète se trouve dans /usr/include/sys/sysevent/eventdefs.h(recherchez simplement "ZFS" dans ce fichier). Après avoir ajouté des événements, le service doit être redémarré, par exemple:

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

De cette façon, le script sera démarré lorsque tout nettoyage d'un pool se terminera - vous devez vérifier à l'intérieur du script s'il $1est égal au nom de votre pool souhaité. Pourtant, c'est beaucoup moins de frais généraux que les sondages.


2

J'utilise ce script simple pour nettoyer les rapports d'état par e-mail.

Si vous avez besoin de détecter la transition de scrub runningà, scrub finishedje vérifierais le statechamp de zpool statussortie. Quelque chose comme ça:

# 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

J'ai regardé le code, mais il semble qu'il ne vous donne l'état que lorsque le script est exécuté. Comment pourrait-il m'informer lorsque le statut passe de "nettoyage" à "terminé"?
un CVn le

@ MichaelKjörling, le script ne se terminera pas tant que le scrub est en cours, car la while ... doneboucle vérifie cette condition.
le-wabbit le

Je pense que quelque chose comme ça est la façon dont je vais aller. Soit dit en passant, cela grep -qdevrait également fonctionner dans votre extrait de script shell, annulant la nécessité de rediriger vers / dev / null. :)
un CVn du

Oui, je l'ai testé sur Solaris 10 avec POSIX grep qui n'a pas cette option.
dsmsk80

Ah ok. Cependant, GNU grep a -q avec la sémantique souhaitée.
un CVn du

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.