Como executar um comando assim que o scrub do ZFS * concluir *?

9

Eu gostaria de usar o cron para agendar scrubs periódicas do meu pool do ZFS e, em um tempo razoavelmente curto após o scrub terminar , enviar um relatório de status por e-mail para mim mesmo. O objetivo deste é pegar qualquer problema sem ter que procurá-los manualmente (empurre ao invés de puxar).

A primeira parte é fácil: basta configurar uma tarefa do cron para executar zpool scrub $POOL como root em qualquer intervalo que seja razoável em minha situação específica.

A segunda parte, não sei bem como fazer. zpool scrub retorna imediatamente e, em seguida, o scrub é executado em segundo plano pelo sistema (o que certamente é um comportamento desejável se o scrub for iniciado por um administrador de um terminal). zpool status me fornece um relatório de status e sai (com o código de saída 0 enquanto o scrub está em execução; ele ainda não foi concluído, por isso não sei se o status de saída é alterado, mas duvido). O único parâmetro documentado para o zool scrub é -s para "parar a depuração".

O principal problema é detectar a mudança de status de scrubbing para scrubbing concluído . Dado que, o resto deve se encaixar. / p>

O ideal seria que eu dissesse zpool scrub para não retornar até que o scrub termine, mas não vejo como fazer isso. (Isso tornaria quase fácil simplesmente cron zpool scrub --wait-until-done $POOL; zpool status $POOL .)

Caso isso não aconteça, eu gostaria de perguntar ao sistema se um scrub está em andamento, de preferência de uma forma que não arrisque muito a quebra de uma atualização ou alteração de configuração, para que eu possa agir sobre se devo ou não um scrub previamente executado terminou (executando um status de zpool quando o status de scrub vai de scrubbing para não scrubbing).

Essa configuração específica é para um sistema de estação de trabalho, portanto, embora uma ferramenta de monitoramento como o Nagios provavelmente tenha suplementos que solucionem o problema, parece um pouco exagerado instalar essa ferramenta apenas para esse problema. uma tarefa. Alguém pode sugerir uma solução de baixa tecnologia para o problema?

    
por a CVn 14.09.2013 / 21:43

4 respostas

11

Em ZFS No Linux , começando com versão 0.6.3 , isso pode ser tratado de maneira bastante elegante usando o < strong> ZFS Event Daemon (zed). O daemon de eventos, em virtude de monitorar os eventos do kernel diretamente, pode reagir quase imediatamente a quaisquer eventos que ocorram e não dependem de pesquisa e análise contínuas de alguma saída do comando. .

Crie um script de shell com qualquer nome de arquivo que comece com /etc/zfs/zed.d/scrub.finish (por exemplo, scrub.finish-custom.sh ). Esse script pode executar qualquer ação apropriada, como enviar um email, gravar uma entrada de log em algum lugar ou fazer o sistema cantar e dançar (OK, talvez não seja isso). São fornecidos exemplos que podem fornecer um ponto de partida.

Se tudo o que você quer é receber um email quando o scrub estiver concluído, o script scrub.finish-email.sh fornecido fará isso muito bem. Basta editar /etc/zfs/zed.d/zed.rc para indicar para onde o e-mail deve ser enviado e se um e-mail deve ser enviado também se o pool não estiver tendo problemas, certifique-se de que algo chamado scrub.finish seguido por qualquer coisa em /etc/zfs/zed.d leva a ele, e certifique-se de que o zed é iniciado na inicialização.

    
por 18.06.2014 / 11:11
3

Embora esta questão seja específica do linux, é o primeiro resultado do google quando pesquisando "aguarde até que o scrub termine" , portanto gostaria de adicionar algumas informações úteis para pessoas que executam o OpenSolaris ( testado no OmniOS, mas SmartOS, illumos etc. devem ser similares) em vez do Linux (o Solaris normal também deve funcionar, mas eu não testei lá).

Você pode usar syseventadm para registrar eventos do kernel. A lista completa pode ser encontrada em /usr/include/sys/sysevent/eventdefs.h (apenas procure por "ZFS" neste arquivo). Após adicionar eventos, o serviço deve ser reiniciado, por exemplo:

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

Desta forma, o script será iniciado quando qualquer scrubbing de qualquer pool terminar - você tem que verificar dentro do script se $1 é igual ao nome do seu pool desejado. Ainda assim, é muito menos sobrecarga do que a pesquisa.

    
por 27.01.2016 / 10:01
2

Eu uso este script simples para analisar os relatórios de status por e-mail.

Se você precisar detectar a transição de scrub running para scrub finished , eu verificaria o campo state de zpool status output. Algo parecido com isto:

# 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
    
por 14.09.2013 / 21:55
1

Eu tive muito sucesso com o zfswatcher

    
por 14.09.2013 / 22:06