O script a seguir deve fazer o trabalho.
LOG_SIZE=500000
NUM_SEGM=2
while getopts "s:n:" opt; do
case "$opt" in
s)
LOG_SIZE=$OPTARG
;;
n)
NUM_SEGM=$OPTARG
;;
esac
done
shift $((OPTIND-1))
if [ $# == 0 -o -z "$1" ]; then
echo "missing output file argument"
exit 1
fi
OUT_FILE=$1
shift
NUM=1
while :; do
dd bs=10 count=$(($LOG_SIZE/10)) >> $OUT_FILE 2>/dev/null
SZ='stat -c%s $OUT_FILE'
if [ $SZ -eq 0 ]; then
rm $OUT_FILE
break
fi
echo -e "\nLog portion finished" >> $OUT_FILE
mv $OUT_FILE $OUT_FILE.n$NUM
NUM=$(($NUM + 1))
[ $NUM -gt $NUM_SEGM ] && NUM=1
done
Tem alguns atalhos óbvios, mas no geral
faz o que você pediu.
Ele dividirá o log em pedaços de tamanho limitado,
e a quantidade de pedaços também é limitada. Tudo pode ser
especificado através dos argumentos da linha de comando. O arquivo de log é
também especificado através da linha de comando.
Observe uma pequena pegadinha se você a usar com o daemon
que se bifurca no fundo. Usando um tubo irá impedir
o daemon de ir para o fundo. Neste caso,
é uma sintaxe (provavelmente bash-specific) para evitar o problema:
my_daemon | ( logger.sh /var/log/my_log.log <&0 & )
Observe que o <&0
, embora aparentemente redundante, não funcionará sem isso.