Update how accounting log files are rotated.

The old version had a race between the time that the old file was
cp'ed to acct.0 and the time that 'sa -s' was run that prevented
the commands that occurred in the meantime from being backed up.

It's also arguable that the old version was inefficient in using
cp which can be a problem on a space-constrained system.

This version avoids both problems, albeit it's considerably more
complicated. The advantage of putting the log rotation in the rc.d
script is that it can handle the _enable and _file questions without
having to do gymnastics to discover either value in the periodic script.

As a side effect of reviewing the rc.d script I cleaned it up a bit.
This commit is contained in:
Doug Barton 2011-02-22 21:13:40 +00:00
parent 6fd359f8f4
commit 0a6cd3ac6d
2 changed files with 40 additions and 13 deletions

View File

@ -41,13 +41,16 @@ case "$daily_accounting_enable" in
m=$n
n=$(($n - 1))
done
cp -pf acct acct.0 || rc=3
sa -s $daily_accounting_flags || rc=3
/etc/rc.d/accounting rotate_log || rc=3
case "$daily_accounting_compress" in
[Yy][Ee][Ss])
gzip -f acct.0 || rc=3;;
gzip --keep -f acct.0 || rc=3;;
esac
sa -s $daily_accounting_flags /var/account/acct.0 &&
unlink acct.0 || rc=3
fi;;
*) rc=0;;

View File

@ -14,28 +14,31 @@ name="accounting"
rcvar=`set_rcvar`
accounting_command="/usr/sbin/accton"
accounting_file="/var/account/acct"
extra_commands="rotate_log"
start_cmd="accounting_start"
stop_cmd="accounting_stop"
rotate_log_cmd="accounting_rotate_log"
accounting_start()
{
local _dir
_dir=`dirname "$accounting_file"`
if [ ! -d `dirname "$_dir"` ]; then
_dir="${accounting_file%/*}"
if [ ! -d "$_dir" ]; then
if ! mkdir -p "$_dir"; then
warn "Could not create $_dir."
return 1
err 1 "Could not create $_dir."
fi
fi
if [ ! -e "$accounting_file" ]; then
touch "$accounting_file"
fi
if [ ! -f ${accounting_file} ]; then
echo "Creating accounting file ${accounting_file}"
( umask 022 ; > ${accounting_file} )
if [ ! -e "$accounting_file" ]; then
echo -n "Creating accounting file ${accounting_file}"
touch "$accounting_file"
echo '.'
fi
chmod 644 "$accounting_file"
echo "Turning on accounting."
${accounting_command} ${accounting_file}
}
@ -46,5 +49,26 @@ accounting_stop()
${accounting_command}
}
accounting_rotate_log()
{
local _dir _file
_dir="${accounting_file%/*}"
cd $_dir
if checkyesno accounting_enable; then
_file=`mktemp newacct-XXXXX`
${accounting_command} ${_dir}/${_file}
fi
mv ${accounting_file} ${accounting_file}.0
if checkyesno accounting_enable; then
ln $_file ${accounting_file##*/}
${accounting_command} ${accounting_file}
unlink $_file
fi
}
load_rc_config $name
run_rc_command "$1"