diff options
author | dougb <dougb@FreeBSD.org> | 2011-02-22 21:13:40 +0000 |
---|---|---|
committer | dougb <dougb@FreeBSD.org> | 2011-02-22 21:13:40 +0000 |
commit | 7cea22540cedabac2509b77af9bb24843679a751 (patch) | |
tree | 86f9fe33da39fa232a253a1453d72a02d08f1272 /etc/rc.d | |
parent | f4cf481489b4389917b5159274baa5bbad704e3f (diff) | |
download | FreeBSD-src-7cea22540cedabac2509b77af9bb24843679a751.zip FreeBSD-src-7cea22540cedabac2509b77af9bb24843679a751.tar.gz |
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.
Diffstat (limited to 'etc/rc.d')
-rwxr-xr-x | etc/rc.d/accounting | 40 |
1 files changed, 32 insertions, 8 deletions
diff --git a/etc/rc.d/accounting b/etc/rc.d/accounting index e4ae4a1..7ebc11f 100755 --- a/etc/rc.d/accounting +++ b/etc/rc.d/accounting @@ -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 + echo -n "Creating accounting file ${accounting_file}" touch "$accounting_file" + echo '.' fi + chmod 644 "$accounting_file" - if [ ! -f ${accounting_file} ]; then - echo "Creating accounting file ${accounting_file}" - ( umask 022 ; > ${accounting_file} ) - fi 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" |