web-dev-qa-db-fra.com

Comment exécuter une commande une fois qu'un gommage ZFS * complète *?

J'aimerais utiliser Cron pour planifier des gommages périodiques de ma piscine ZFS et à un peu de temps raisonnablement court après la finition de gommage , envoyer un rapport de statut à moi-même. . Le but est de capturer tout problème sans avoir à les chercher manuellement (pousser plutôt que tirer).

La première partie est facile: il suffit de mettre en place un travail cron pour exécuter zpool scrub $POOL En tant que racine à tout intervalle est raisonnable dans ma situation particulière.

La deuxième partie, je ne suis pas si sûr de quoi faire. zpool scrub retourne immédiatement, puis le gommage est exécuté dans l'arrière-plan par le système (ce qui est certainement un comportement souhaitable si le gommage est initié par un administrateur d'un terminal). zpool status me donne un rapport d'état et des sorties (avec le code de sortie 0 tandis que le gommage est en cours d'exécution; il n'a pas encore fini donc je ne sais pas si le statut de sortie change une fois que c'est fait, mais j'en doute). Le seul paramètre documenté pour zpool gommage est -s pour "arrêter le nettoyage".

Le problème principal consiste à détecter le changement d'état de Scrubbing à fini de nettoyage . donné cela, le reste doit tomber en place.

Idéalement, je voudrais dire zpool scrub Pour ne pas revenir avant que le gommage se termine, mais je ne vois pas de moyen de le faire faire ça. (Cela rendrait presque trop facile pour simplement cron zpool scrub --wait-until-done $POOL; zpool status $POOL.)

À défaut, j'aimerais demander au système si un gommage est actuellement en cours, de préférence d'une manière qui ne fait pas trop de risque de rompre avec une mise à niveau ou une modification de la configuration, de sorte que je puisse agir ou non un précédent. Le gommage a fini (en exécutant un statut Zpool lorsque le statut de gommage passe de ne pas nettoyer).

Cette configuration particulière est pour un système de postage, alors lorsqu'un outil de surveillance tel que Nagios est probablement a des compléments qui résoudraient le problème, il se sent plutôt surexploitant Pour installer un tel outil pour cette seule tâche. Quelqu'un peut-il suggérer une solution moins technologique au problème?

11
a CVn

Bien que cette question soit spécifique à Linux, c'est le premier résultat de Google lors de la recherche "Attendez que le gommage est terminé", je voudrais donc ajouter des informations utiles pour les personnes exécutées OpenSolaris (testées 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 syseventadm pour enregistrer les événements du noyau. La liste complète peut être trouvée dans /usr/include/sys/sysevent/eventdefs.h (juste chercher "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 frottage de n'importe quelle piscine se termine - vous devez vérifier à l'intérieur du script si $1 est égal à votre nom de piscine souhaitée. Néanmoins, il y a beaucoup moins de frais généraux que de sondages.

3
user121391

J'utilise ce script simple pour le réclamation d'état de nettoyage par courrier électronique.

Si vous avez besoin de détecter la transition de scrub running Sur scrub finished Je vérifierais le champ state de zpool status. 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
2
dsmsk80