
Eu gostaria de usar o cron para agendar limpezas periódicas do meu pool ZFS e em um tempo razoavelmente curtodepois que a esfoliação terminar, envie um relatório de status por e-mail para mim mesmo. O objetivo disso é detectar quaisquer problemas sem ter que procurá-los manualmente (empurrar em vez de puxar).
A primeira parte é fácil: basta configurar um cron job para ser executado zpool scrub $POOL
como root em qualquer intervalo que seja razoável na minha situação específica.
A segunda parte, não tenho tanta certeza de como fazer. zpool scrub
retorna imediatamente e então a limpeza é executada em segundo plano pelo sistema (o 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 a limpeza está em execução; ainda não foi concluída, então não sei se o status de saída muda depois de concluído, mas duvido). O único parâmetro documentado para zpool scrub é -s
"parar de esfregar".
O principal problema é detectar a mudança de status deesfregandoparaterminei de esfregar.Diante disso, o resto deve se encaixar.
Idealmente, eu gostaria de dizer zpool scrub
para não retornar até que a esfoliação termine, mas não vejo nenhuma maneira de fazer isso. (Seria muito fácil simplesmente cron zpool scrub --wait-until-done $POOL; zpool status $POOL
.)
Caso contrário, gostaria de perguntar ao sistema se uma limpeza está em andamento, de preferência de uma forma que não corra muito risco de interromper uma atualização ou alteração de configuração, para que eu possa agir sobre se uma execução anterior ou não esfrega foi concluído (executando um zpool status quando o status de esfrega passa de esfregando para não esfregando).
Esta configuração específica é para um sistema de estação de trabalho, portanto, embora uma ferramenta de monitoramento como o Nagiosprovavelmentetem suplementos que resolveriam o problema, parece um exagero instalar tal ferramenta apenas para esta tarefa.Alguém pode sugerir uma solução de baixa tecnologia para o problema?
Responder1
SobreZFS no Linux, começando comversão 0.6.3isso pode ser tratado com bastante elegância usando oDaemon de eventos ZFS (zed).O daemon de eventos, em virtude de monitorar diretamente os eventos do kernel, pode reagir quase imediatamente a quaisquer eventos que ocorram e não depende de pesquisa e análise contínua 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 realizar qualquer ação apropriada, como enviar um e-mail, escrever uma entrada de log em algum lugar ou fazer o sistema cantar e dançar (OK, talvez não). São fornecidos exemplos que podem fornecer um ponto de partida.
Se tudo o que você deseja é receber um e-mail quando a limpeza for concluída, o scrub.finish-email.sh
script fornecido fará isso perfeitamente. Simplesmente edite /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 apresentando problemas, certifique-se de algo nomeado scrub.finish
seguido de qualquer coisa em /etc /zfs/zed.d leva a isso e certifique-se de que zed seja iniciado na inicialização.
Responder2
Embora esta questão seja específica para Linux, é o primeiro resultado do Google ao pesquisar por"espere até que a limpeza termine", portanto, gostaria de adicionar algumas informações úteis para pessoas que executam o OpenSolaris (testei no OmniOS, mas SmartOS, illumos etc. devem ser semelhantes) em vez do Linux (o Solaris normal também deve funcionar, mas 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 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 limpeza de qualquer pool terminar - você deve verificar dentro do script se é $1
igual ao nome do pool desejado. Ainda assim, é muito menos oneroso do que a votação.
Responder3
Eu uso este script simples para limpar relatórios de status por e-mail.
Se você precisar detectar a transição de scrub running
para scrub finished
eu verificaria o state
campo de zpool status
saí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
Responder4
Versões recentes do ZFS adicionaram precisamente o que o OP pediu: use -w
para aguardar a conclusão da limpeza antes de retornar. Por exemplo:
zpool scrub tank -w ; zpool status tank | mail -s "report" [email protected]