Eu tenho um script bash que é executado enquanto a máquina Linux estiver ligada. Começo como mostrado abaixo:
( /mnt/apps/start.sh 2>&1 | tee /tmp/nginx/debug_log.log ) &
Após o lançamento, posso ver o comando tee na minha saída ps, como mostrado abaixo:
$ ps | grep tee
418 root 0:02 tee /tmp/nginx/debug_log.log
3557 root 0:00 grep tee
Eu tenho uma função que monitora o tamanho do log que tee produz e mata o comando tee quando o log atinge um determinado tamanho:
monitor_debug_log_size() {
## Monitor the file size of the debug log to make sure it does not get too big
while true; do
cecho r "CHECKING DEBUG LOG SIZE... "
debugLogSizeBytes=$(stat -c%s "/tmp/nginx/debug_log.log")
cecho r "DEBUG LOG SIZE: $debugLogSizeBytes"
if [ $((debugLogSizeBytes)) -gt 100000 ]; then
cecho r "DEBUG LOG HAS GROWN TO LARGE... "
sleep 3
#rm -rf /tmp/nginx/debug_log.log 1>/dev/null 2>/dev/null
kill -9 `pgrep -f tee`
fi
sleep 30
done
}
Para minha surpresa, matar o comando tee também mata pela instância start.sh. Por que é isso? Como posso terminar o comando tee, mas meu start.sh continua em execução? Obrigado.
tee -a
paratee
abrir o arquivo no modo de acréscimo; caso contrário, o tee continuará gravando o arquivo no mesmo deslocamento após a truncagem (e em sistemas que não suportam arquivos esparsos, como no macOS, que realoque a seção do arquivo que leva até essa posição, ocupando o dobro do espaço em disco).logger -s
para o syslog para cuidar do registro (-s
para também imprimir no stderr).logrotate
. Ótimo programaExplicando o "porquê"
Resumindo: se falhas de gravação não causassem a saída de um programa (por padrão), teríamos uma bagunça. Considere
find . | head -n 10
- você não querfind
continuar correndo, examinando o restante do seu disco rígido, depois dehead
já ter tomado as 10 linhas necessárias e prosseguido.Melhorando: gire dentro do seu logger
Considere o seguinte, que não usa
tee
nada, como um exemplo demonstrativo:Se executado como:
... isso começará anexando a
/tmp/nginx/debug_log
, renomeando o arquivo para/tmp/nginx/debug_log.old
quando mais de 100 KB de conteúdo estiverem presentes. Como o próprio criador de logs está fazendo a rotação, não há canal quebrado, nenhum erro e nenhuma janela de perda de dados quando a rotação ocorre - todas as linhas serão gravadas em um arquivo ou outro.Obviamente, implementar isso no bash nativo é ineficiente, mas o acima é um exemplo ilustrativo. Existem inúmeros programas disponíveis que implementarão a lógica acima para você. Considerar:
svlogd
, o log de serviço do conjunto Runit.s6-log
, uma alternativa mantida ativamente do pacote skanet.multilog
DJB Daemontools, o avô desta família de ferramentas de supervisão e monitoramento de processos.fonte