accounting: ac

 
 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 'ac's 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 '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).
 
 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.