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 $POOL
como 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 scrub
retorna 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 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 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 é -s
para "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 scrub
para 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?
fonte
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
syseventadm
para 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: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.fonte
Eu uso esse script simples para limpar os relatórios de status por email.
Se você precisar detectar a transição de
scrub running
parascrub finished
eu verificaria ostate
campo dezpool status
saída. Algo assim:fonte
while ... done
verificação de loop para essa mesma condição.grep -q
deve funcionar também nesse seu snippet de script de shell, negando a necessidade de redirecionar para / dev / null. :)Eu tive muito sucesso com o zfswatcher
fonte