#!/bin/sh # # logd: rotate logfiles PROG="$0" error() { echo 1>&2 "ERROR: $1" exit 127 } warn() { echo 1>&2 "WARNING: $1" } usage() { error "Usage: $PROG LIMIT{k|s} FILE CYCLES" } rotate() { local FILE="$1" local COUNT="$2" for ITEM in $(seq $COUNT \-1 0); do CURFILE="${FILE}.${ITEM}" NEXTFILE="${FILE}.$((${ITEM}+1))" if [ "${ITEM}" = "${COUNT}" ]; then rm "${CURFILE}" 2>/dev/null else mv "${CURFILE}" "${NEXTFILE}" 2>/dev/null fi done mv "${FILE}" "${FILE}.0" && touch "${FILE}" echo rotated } chksize() { local FILE="$1" du -k "${FILE}" | cut -f 1 } THRS="$1" FILE="$2" CYCL="$3" case "$THRS" in *k) TYPE=size LIMIT="${THRS%[ks]}" ;; *s) TYPE=time LIMIT="${THRS%[ks]}" COUNTER="${LIMIT}" ;; \?) usage ;; esac test "${LIMIT:=-1}" -gt 0 || usage test "${CYCL:=-1}" -gt 0 || usage test -f ${FILE} || usage while :; do if [ "${TYPE}" = "size" ]; then if [ "$(chksize "${FILE}")" -gt "${LIMIT}" ]; then rotate "${FILE}" "${CYCL}" fi else if [ "${COUNTER}" -eq 0 ]; then rotate "${FILE}" "${CYCL}" COUNTER="${LIMIT}" fi COUNTER="$((${COUNTER}-1))" fi sleep 1 done