ac
The ac
command prints out a report of connect time (in hours)
based on the logins/logouts in the current wtmp
file.
A total is also printed out.
The accounting file wtmp
is maintained by init
and login
. Neither of these programs creates the file; if the
file is not there, no accounting is done. To begin accounting, create
the file with a length of zero. NOTE: the
wtmp
file can get really big, really fast. You might
want to trim it every once and a while.
GNU ac
works nearly the same u*x ac
, though it's a little
smarter in its printing out of daily totals—it actually prints
every day, rather than skipping to the date of the next entry in
the wtmp
file.
All of the original ac
's options have been implemented, and a few have
been added. Normally, when ac
is invoked, the output looks like
this:
total 93867.14
where total is the number of hours of connect time for every entry in
the wtmp
file. The rest of the flags modify the
output in one way or another.
-d
--daily-totals
Jul 3 total 1.17 Jul 4 total 2.10 Jul 5 total 8.23 Jul 6 total 2.10 Jul 7 total 0.30
-p
--individual-totals
bob 8.06 goff 0.60 maley 7.37 root 0.12 total 16.15
-f
filename--file
filenamewtmp
file.
--complain
wtmp
file has a problem (a time-warp, missing
record, or whatever), print out an appropriate error.
--reboots
ac
's automatically count the
time between the login and the reboot record against the user (even
though all of that time shouldn't be, perhaps, if the system is
down for a long time, for instance). If you want to count this time,
include the flag. To make ac
behave like the one that
was distributed with your OS, include this flag.
--supplants
ac
behave like the one that was distributed with your OS, include
this flag.
--timewarps
wtmp
file will suddenly jump
back into the past without a clock change record occurring. It is
impossible to know how long a user was logged in when this occurs. If
you want to count the time between the login and the time warp against
the user, include this flag. To make ac
behave like the
one that was distributed with your OS, include this flag.
--compatibility
-a
--all-days
-y
--print-year
--print-zeros
--debug
--tw-leniency
valuewtmp
files might be slightly out of order (most
notably when two logins occur within a one-second period – the second
one gets written first). By default, this value is set to 1 second.
Some wtmp
's are really screwed up (Suns) and require a
larger value here. If the program notices this problem, time is not
assigned to users unless the --timewarps
flag is used. See the
Problems section for more information.
--tw-suspicious
valuewtmp
file are farther than this number of seconds
apart, there is a problem with the wtmp file (or your machine
hasn't been used in a year). If the program notices this problem, time
is not assigned to users unless the --timewarps
flag is used.
-V
--version
ac
's version number.
-h
--help
ac
's usage string and default locations of system files to
standard output.
For no fault of ac
's, if two logins occur at the same time
(within a second of each other), each login
process will try to
write an entry to the wtmp
file. With file system
overhead, it is forseeable that the entries would get written in the
wrong order. GNU ac
automatically compensates for this, but some
other ac
s may not... beware.
I've tested the standard ac
in Ultrix 4.2 (DECstation/DECsystem),
SunOS 4.1.1 (Sun3, Sun4, Sparc), Mach 2.5 (Omron/Luna), and DomainOS
10.3 (DN3500). All of these ac
s have trouble parsing entries in
which the line is ftp
xxxx (xxxx being some number).
Whenever these ac
s see one of these entries, they log everyone
out at the time of the entry.
HOW IT HAPPENS: if there is a user logged into the machine when an ftp connection occurs, (minimally) you'll get a login record for the user, a login record for the ftp connection, and the logouts for both afterwards (in either order).
TANGIBLE RESULT: the user who was logged in gets 'logged out'
at the time the ftp connection begins, and none of the time spent during
or after the ftp connection. Therefore, when you run GNU ac
,
the totals will most likely be greater than those of your system's
ac
(provided you specify the other flags that will make GNU
ac
behave like the system's).
On Suns, init
is a little screwed up. For some reason, after a
shutdown record is written, a reboot record is written with a time-stamp
before the shutdown (less than 30 seconds, usually).
TANGIBLE RESULT: GNU ac
will notice the problem, log
everyone out (you can specify if you want the time to be added to the
user's total) and begin a new day entry based on the time of the
out-of-sync record. If you try to print out daily totals, you'll notice
that some days might have two or more entries.
SOLUTION: To fix this, a timewarp leniency value has been implemented. If any record is out of order by this number of seconds (defaults to 60) it gets ignored. If you need to change this value (if you think the totals are off because the value is too high), you can change it using the `--timewarp-value' flag. The rationale for the 60 second default is that of all of the machines with this problem, the largest timewarp was 45.
Some ac
's on System V machines (I've tried SGI Indigo & SGI Indy)
forget to pay attention to the ut_type
field in a struct
utmp
. As such, they chalk up a lot of time to non-existant processes
called LOGIN
or runlevel
.
TANGIBLE RESULT: The amount of total time reported by the
system's ac
is really off. Often, it's several times
greater than what it should be.
SOLUTION: GNU ac
always pays attention to the
ut_type
record, so there's no possibility of chalking up time to
anything but user processes.