Next: , Previous: Preface, Up: Top


1 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 that 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.

1.1 Flags

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
Print totals for each day rather than just one big total at the end. The output looks like this:
          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
Print time totals for each user in addition to the usual everything-lumped-into-one value. It looks like:
                  bob       8.06
                  goff      0.60
                  maley     7.37
                  root      0.12
                  total    16.15

people
Print out the sum total of the connect time used by all of the users included in people. Note that people is a space separated list of valid user names; wildcards are not allowed.
-f filename
--file filename
Read from the file filename instead of the system's wtmp file.
--complain
When the wtmp file has a problem (a time-warp, missing record, or whatever), print out an appropriate error.
--reboots
Reboot records are not written at the time of a reboot, but when the system restarts; therefore, it is impossible to know exactly when the reboot occurred. Users may have been logged into the system at the time of the reboot, and many 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
Sometimes a logout record is not written for a specific terminal, so the time that the last user accrued cannot be calculated. If you want to include the time from the user's login to the next login on the terminal (though probably incorrect), include this flag. To make ac behave like the one that was distributed with your OS, include this flag.
--timewarps
Sometimes, entries in a 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
This is shorthand for typing out the three above options.
-a
--all-days
If we're printing daily totals, print a record for every day instead of skipping intervening days where there is no login activity. Without this flag, time accrued during those intervening days gets listed under the next day where there is login activity.
-y
--print-year
Print out the year when displaying dates.
--print-zeros
If a total for any category (save the grand total) is zero, print it. The default is to suppress printing.
--debug
Print verbose internal information.
--tw-leniency value
Set the time warp leniency value (in seconds). Records in wtmp 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 value
Set the time warp suspicious value (in seconds). If two records in the wtmp 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
Print ac's version number.
-h
--help
Print ac's usage string and default locations of system files to standard output.

1.2 Problems

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 acs may not... beware.

The FTP Problem

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 acs have trouble parsing entries in which the line is ftpxxxx (xxxx being some number). Whenever these acs 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).

The Shutdown/Reboot Problem

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.

Stupid System V Machines

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.