¿Cómo ejecutar un comando una vez que se *completa* la limpieza de ZFS?

¿Cómo ejecutar un comando una vez que se *completa* la limpieza de ZFS?

Me gustaría usar cron para programar limpiezas periódicas de mi grupo ZFS, y en un tiempo razonablemente corto.después de que termine el exfoliante, enviarme por correo electrónico un informe de estado. 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 muy seguro de cómo hacerla. zpool scrubregresa inmediatamente y luego el sistema ejecuta la limpieza en segundo plano (lo cual es ciertamente un comportamiento deseable si la limpieza la inicia un administrador desde una terminal). zpool statusme da un informe de estado y sale (con el código de salida 0 mientras se ejecuta la limpieza; aún no ha terminado, así que no sé si el estado de salida cambia una vez que termina, pero lo dudo). El único parámetro documentado para la limpieza de zpool es -s"detener la limpieza".

El principal problema es detectar el cambio de estado dedepuraciónaterminado de fregar.Teniendo esto en cuenta, el resto debería encajar.

Idealmente, me gustaría decirle zpool scrubque no regrese hasta que termine el exfoliante, pero no veo ninguna manera de lograrlo. (Haría que fuera 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 hay una limpieza actualmente en curso, preferiblemente de una manera que no corra demasiado riesgo de romperse con una actualización o cambio de configuración, para poder actuar sobre si se está ejecutando o no una limpieza previa. La limpieza ha finalizado (ejecutando un estado de zpool cuando el estado de limpieza pasa de limpieza a no limpieza).

Esta configuración particular es para un sistema de estación de trabajo, por lo que si bien una herramienta de monitoreo como Nagiosprobablementetiene complementos que resolverían el problema, parece excesivo instalar una herramienta de este tipo sólo para esta tarea.¿Alguien puede sugerir una solución al problema con menor tecnología?

Respuesta1

EnZFS en Linux, empezando conversión 0.6.3esto se puede manejar de manera bastante elegante usando elDemonio de eventos ZFS (zed).El demonio de eventos, en virtud de monitorear directamente los eventos del kernel, puede reaccionar casi inmediatamente a 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 realizar cualquier acción adecuada, como enviar un correo electrónico, escribir una entrada de registro en algún lugar o hacer que el sistema cante y baile (bueno, 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 dónde se debe enviar el correo electrónico y si se debe enviar un correo electrónico. Si el grupo no tiene ningún problema, asegúrese de que se nombre algo scrub.finishseguido de cualquier cosa en /etc. /zfs/zed.d conduce a él y asegúrese de que zed se inicie al arrancar.

Respuesta2

Aunque esta pregunta es específica de Linux, es el primer resultado de Google al buscar"espera hasta que termine el lavado", por lo tanto, me gustaría agregar información útil para las personas que ejecutan OpenSolaris (lo probé en OmniOS, pero SmartOS, illusmos, etc. deberían ser similares) en lugar de Linux (Solaris normal también debería funcionar, pero no lo probé allí).

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

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

De esta manera, el script se iniciará cuando finalice la limpieza de cualquier grupo; debe verificar dentro del script si es $1igual al nombre del grupo deseado. Aun así, supone muchos menos gastos que las encuestas.

Respuesta3

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

Si necesita detectar una transición de scrub runninga, scrub finishedverificarí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

Respuesta4

Las versiones recientes de ZFS agregaron precisamente lo que pedía el OP: usar -wpara esperar a que finalice la limpieza antes de regresar. Por ejemplo:

zpool scrub tank -w ; zpool status tank | mail -s "report" [email protected]

información relacionada