Como executar um comando depois que uma limpeza * do ZFS é concluída *?


11

Gostaria de usar o cron para agendar scrubs periódicos do meu pool ZFS e, em um período razoavelmente curto após a conclusão do scrub , enviar um relatório de status por e-mail para mim. O objetivo disso é detectar quaisquer problemas sem precisar procurá-los manualmente (pressione em vez de puxar).

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

A segunda parte, não sei ao certo como fazer. zpool scrubretorna imediatamente e, em seguida, a limpeza é executada em segundo plano pelo sistema (que é certamente um comportamento desejável se a limpeza for iniciada por um administrador a partir de um terminal). zpool statusme 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 terminou, então não sei se o status de saída é alterado assim que terminar, mas duvido). O único parâmetro documentado para a limpeza do zpool é -spara "parar a limpeza".

O principal problema é detectar a alteração de status da limpeza para a limpeza concluída . Dado isso, o resto deve se encaixar.

Idealmente, eu gostaria de dizer zpool scrubpara não voltar até a limpeza terminar, mas não vejo nenhuma maneira de fazê-lo. (Seria muito fácil simplesmente agendar zpool scrub --wait-until-done $POOL; zpool status $POOL.)

Caso contrário, eu gostaria de perguntar ao sistema se uma limpeza está em andamento, de preferência de uma maneira que não corra o risco de ser interrompida por uma atualização ou alteração de configuração, para que eu possa agir sobre se uma execução anterior está ou não em execução. a limpeza foi concluída (executando um status zpool quando o status de limpeza passa de lavagem para não lavagem).

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 resolveriam o problema, é um exagero instalar essa ferramenta apenas para esta tarefa. Alguém pode sugerir uma solução de baixa tecnologia para o problema?

Respostas:


13

No ZFS No Linux , a partir da versão 0.6.3, isso pode ser tratado de maneira bastante elegante usando o ZFS Event Daemon (zed). O daemon de eventos, em virtude do monitoramento direto dos eventos do kernel, pode reagir quase imediatamente a qualquer evento que ocorra e não depende de pesquisa e análise contínuas da saída de algum outro 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, escrever 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ê deseja é receber um email quando a limpeza for concluída, o scrub.finish-email.shscript fornecido fará isso muito bem. Simplesmente edite /etc/zfs/zed.d/zed.rc para indicar para onde o email deve ser enviado e se um email deve ser enviado também se o pool não estiver tendo problemas, verifique se algo com o nome scrub.finishseguido por qualquer coisa em / etc /zfs/zed.d leva a ele e certifique-se de que o zed seja iniciado na inicialização.



3

Embora essa pergunta seja específica ao linux, é o primeiro resultado do google ao pesquisar "aguarde até que a depuração seja concluída" , portanto, gostaria de adicionar algumas informações úteis para pessoas que executam o OpenSolaris (testadas no OmniOS, mas no SmartOS, illumos etc. deve ser semelhante) em vez do Linux (o Solaris normal também deve funcionar, mas eu não testei lá).

Você pode usar syseventadmpara registrar eventos do kernel. A lista completa pode ser encontrada em /usr/include/sys/sysevent/eventdefs.h(basta procurar "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

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


2

Eu uso esse script simples para limpar os relatórios de status por email.

Se você precisar detectar a transição de scrub runningpara scrub finishedeu verificaria o statecampo de zpool statussaída. Algo assim:

# 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

Eu olhei para o código, mas parece que ele apenas fornece o status quando o script é executado. Como me notificaria quando o status passa de "apagando" para "concluído"?
a CVn 14/09/13

@ MichaelKjörling o script não será concluído enquanto a limpeza estiver em andamento devido à while ... doneverificação de loop para essa mesma condição.
the-wabbit 14/09

Eu acho que algo assim é o caminho que irei. A propósito, grep -qdeve funcionar também nesse seu snippet de script de shell, negando a necessidade de redirecionar para / dev / null. :)
um CVn 15/09/13

Sim, eu testei no Solaris 10 com POSIX grep, que não possui essa opção.
precisa saber é o seguinte

Ah ok. O GNU grep possui -q com a semântica desejada, no entanto.
um CVn 15/09/13

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.