¿Cómo ejecutar un comando una vez que un ZFS scrub * completa *?

11

Me gustaría usar cron para programar revisiones periódicas de mi grupo ZFS, y en un tiempo razonablemente corto después de que finalice la limpieza , enviarme un informe de estado por correo electrónico. El propósito de esto es detectar cualquier problema sin tener que buscarlo manualmente (empujar en lugar de tirar).

La primera parte es fácil: simplemente configure un trabajo cron para que se ejecute zpool scrub $POOLcomo root en cualquier intervalo que sea razonable en mi situación particular.

La segunda parte, no estoy tan seguro de cómo hacerlo. zpool scrubvuelve inmediatamente y luego el sistema ejecuta el scrub en segundo plano (lo que sin duda es un comportamiento deseable si el scrub lo inicia un administrador desde un terminal). zpool statusme da un informe de estado y sale (con el código de salida 0 mientras se ejecuta el scrub; aún no ha terminado, así que no sé si el estado de salida cambia una vez que está hecho, pero lo dudo). El único parámetro documentado para la limpieza de zpool es -spara "detener la limpieza".

El principal problema es detectar el cambio de estado de lavado a lavado terminado . Dado eso, el resto debe caer en su lugar.

Idealmente, me gustaría decirle zpool scrubque no regrese hasta que termine el exfoliante, pero no veo ninguna forma de hacerlo. (Sería casi demasiado fácil simplemente cron zpool scrub --wait-until-done $POOL; zpool status $POOL.)

De lo contrario, me gustaría preguntarle al sistema si un fregado está actualmente en progreso, preferiblemente de una manera que no corra demasiado riesgo de romper con una actualización o cambio de configuración, para que pueda decidir si se está ejecutando o no scrub ha finalizado (al ejecutar un estado de zpool cuando el estado de scrub pasa de scrubbing a no scrubbing).

Esta configuración particular es para un sistema de estación de trabajo, por lo que si bien una herramienta de monitoreo como Nagios probablemente tiene complementos que resolverían el problema, se siente demasiado exagerado instalar dicha herramienta solo para esta tarea. ¿Alguien puede sugerir una solución de baja tecnología para el problema?

un CVn
fuente

Respuestas:

13

En ZFS En Linux , a partir de la versión 0.6.3, esto se puede manejar con bastante elegancia utilizando el ZFS Event Daemon (zed). El demonio de eventos, en virtud de la supervisión directa de los eventos del kernel, puede reaccionar casi de inmediato ante cualquier evento que tenga lugar y no depende del sondeo y análisis continuo de la salida de algún otro comando.

Cree un script de shell con cualquier nombre de archivo que comience con /etc/zfs/zed.d/scrub.finish(por ejemplo, scrub.finish-custom.sh). Ese script puede tomar cualquier acción apropiada, como enviar un correo electrónico, escribir una entrada de registro en algún lugar o hacer que el sistema cante y baile (OK, tal vez no sea eso). Se proporcionan ejemplos que pueden proporcionar un punto de partida.

Si todo lo que desea es recibir un correo electrónico cuando se complete la limpieza, el scrub.finish-email.shscript proporcionado lo hará muy bien. Simplemente edite /etc/zfs/zed.d/zed.rc para indicar a dónde debe enviarse el correo electrónico y si debe enviarse un correo electrónico también si el grupo no está experimentando ningún problema, asegúrese de que algo llamado scrub.finishseguido de algo en / etc. /zfs/zed.d conduce a él, y asegúrese de que zed se inicie en el arranque.

un CVn
fuente
para la implementación actual ver wiki.archlinux.org/index.php/ZFS#Monitoring_/_Mailing_on_Events
Stuart Cardall
3

Aunque esta pregunta es específica de Linux, es el primer resultado de Google cuando se busca "esperar hasta que termine el fregado" , por lo tanto, me gustaría agregar información útil para las personas que ejecutan OpenSolaris (lo probé en OmniOS, pero SmartOS, illumos, etc. . debería ser similar) en lugar de Linux (Solaris normal también debería funcionar, pero no lo probé allí).

Puede usar syseventadmpara registrar eventos del kernel. La lista completa se puede encontrar en /usr/include/sys/sysevent/eventdefs.h(solo busque "ZFS" en este archivo). Después de agregar eventos, el servicio debe reiniciarse, por ejemplo:

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

De esta manera, la secuencia de comandos se iniciará cuando finalice la limpieza de cualquier grupo; debe verificar dentro de la secuencia de comandos si $1es igual al nombre de grupo deseado. Aún así, es mucho menos sobrecarga que las encuestas.

usuario121391
fuente
2

Utilizo este sencillo script para eliminar informes de estado por correo electrónico.

Si necesita detectar la transición de scrub runninga scrub finished, verificaría el statecampo de zpool statussalida. Algo como esto:

# 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
dsmsk80
fuente
Miré el código, pero parece que solo te da el estado cuando se ejecuta el script. ¿Cómo me notificaría cuando el estado pase de "depuración" a "terminado"?
un CVn
@ MichaelKjörling la secuencia de comandos no finalizará mientras el exfoliante esté en progreso debido a la while ... donecomprobación de bucle para esta misma condición.
the-wabbit
Creo que algo así es como voy a ir. Por cierto, grep -qdebería funcionar también en ese fragmento de script de shell tuyo, negando la necesidad de redirigir a / dev / null. :)
un CVn
Sí, lo probé en Solaris 10 con POSIX grep que carece de esta opción.
dsmsk80
Ah ok. Sin embargo, GNU grep tiene -q con la semántica deseada.
un CVn