系统管理指南:高级管理

第 10 章 系统记帐(参考)

本章提供有关系统记帐的参考信息。

以下是本章中参考信息的列表。

有关系统记帐任务的更多信息,请参见第 9 章

runacct 脚本

主要的每日记帐脚本 runacct 通常由 cron 命令在正常工作时间之外调用。runacct 脚本可以处理连接、费用、磁盘和进程记帐文件。此脚本还可准备每日摘要文件和累积摘要文件,以供 prdailymonacct 脚本记帐。

runacct 脚本可在发生错误时防止文件受到损坏。

使用一系列保护机制来执行以下任务:

该脚本通过向 active 文件中写入描述性消息来记录其进度。除非另有说明,否则假定 runacct 脚本所使用的文件位于 /var/adm/acct/nite 目录中。runacct 脚本执行期间的所有诊断输出都写入 fd2log 文件中。

调用 runacct 脚本时,将会创建 locklock1 文件。这些文件可防止同时执行 runacct 脚本。如果调用 runacct 程序时已经存在上述文件,则该程序将列显错误消息。lastdate 文件中包含上次调用 runacct 脚本的月份和日期,以避免每天多次执行脚本。

如果 runacct 脚本检测到错误,则会发生以下情况:

有关如何重新启动 runacct 脚本的说明,请参见如何重新启动 runacct 脚本

要允许重新启动 runacct 脚本,需要将处理细分为不同的可重复执行状态。statefile 文件用于跟踪完成的上一个状态。当每个状态完成时,都会更新 statefile 文件,以反映下一个状态。该状态的处理完成后,将读取 statefile 文件并处理下一个状态。当 runacct 脚本达到 CLEANUP 状态时,它将删除锁定并结束。将按下表所示来执行状态。

表 10–1 runacct 脚本的状态

状态 

说明 

SETUP

执行 turnacct switch 命令以创建新的 pacct 文件。/var/adm/pacct n 进程记帐文件(pacct 文件除外)被移至 /var/adm/Spacct n.MMDD 文件。/var/adm/wtmpx 文件被移至 /var/adm/acct/nite/wtmp.MMDD 文件(在结尾添加了当前时间记录)并创建一个新 /var/adm/wtmp 文件。closewtmputmp2wtmp 程序将向 wtmp.MMDD 文件和新的 wtmpx 文件中添加记录,以便 对当前登录的用户进行说明。

WTMPFIX

wtmpfix 程序检查 nite 目录中的 wtmp.MMDD 文件是否正确。由于某些日期更改会导致 acctcon 程序失败,所以 wtmpfix 程序会在有日期更改记录时尝试调整 wtmpx 文件中的时间标记。此程序还可删除 wtmpx 文件中的任何已损坏项。将 wtmp.MMDD 文件的已修复版本写入 tmpwtmp 文件。

CONNECT

acctcon 程序用于在文件 ctacct.MMDD 中记录连接记帐记录。这些记录使用 tacct.h 格式。此外,acctcon 程序还创建 lineusereboots 文件。reboots 文件会记录在 wtmpx 文件中找到的所有引导记录。

PROCESS

acctprc 程序用于将 /var/adm/Spacctn.MMDD 进程记帐文件转换为 ptacctn.MMDD 文件中的完整记帐记录。Spacctptacct 文件通过数字进行关联,这样在 runacct 脚本失败时,将不处理 Spacct 文件。

MERGE

acctmerg 程序将进程记帐记录与连接记帐记录合并,以形成 daytacct 文件。

FEES

acctmerg 程序将 fee 文件中的 ASCII tacct 记录合并到 daytacct 文件中。

DISK

dodisk 脚本可生成 disktacct 文件。如果 dodisk 脚本已运行并生成 disktacct 文件,则 DISK 程序会将该文件合并到 daytacct 文件中,并将 disktacct 文件移至 /tmp/disktacct.MMDD 文件。

MERGETACCT

acctmerg 程序将 daytacct 文件与 sum/tacct 文件(累计总记帐文件)合并。每天都将 daytacct 文件保存到 sum/tacct.MMDD 文件中,这样便可在 sum/tacct 文件损坏或丢失时重新创建该文件。

CMS

acctcms 程序多次运行。第一次运行该程序是为了使用 Spacct n 文件生成命令摘要,并向 sum/daycms 文件写入数据。第二次运行 acctcms 程序是为了将 sum/daycms 文件与 sum/cms 累积命令摘要文件合并。最后,再运行 acctcms 程序,以生成 nite/daycmsnite/cms,即分别来自 sum/daycmssum/cms 的 ASCII 文件。lastlogin 程序用于创建 /var/adm/acct/sum/loginlog 日志文件。此文件将报告每个用户的上次登录时间。如果 runacct 脚本在午夜后运行,则显示某些用户上次登录时间的日期会与正确日期相差一天。

USEREXIT

任何与安装相关(本地)的记帐程序都可在此点运行。runacct 脚本预计此程序为 /usr/lib/acct/runacct.local 程序。

CLEANUP

此状态可清除临时文件、运行 prdaily 脚本、将其输出保存至 sum/rpt.MMDD 文件、删除锁定,然后退出。


注意 – 注意 –

如果以 CLEANUP 状态重新启动 runacct 脚本,请删除最后一个 ptacct 文件,因为该文件将不完整。


每日记帐报告

runacct shell 脚本可在每次调用时生成五个基本报告。下表对这些报告进行了描述。

表 10–2 每日记帐报告

报告类型 

说明 

每日报告

tty 数显示终端线使用率。

每日使用情况报告

按用户指明系统资源的使用情况(按用户 ID 的顺序列出)。 

每日命令摘要

按命令指明系统资源的使用率,按内存使用的降序列出。换言之,使用内存最多的命令列在最前面。在每月命令摘要中会为当月报告此信息。  

每月命令摘要

反映自上次调用 monacct 程序以来所累积数据的累计摘要。

上次登录报告

显示每位用户上次登录的时间(按年代顺序列出)。 

每日报告

此报告提供了所使用的每个终端线的信息。下面是一个每日报告样例:


Jan 16 02:30 2004  DAILY REPORT FOR venus Page 1


from Mon Jan 15 02:30:02 2004
to   Tue Oan 16 02:30:01 2004
1       runacct
1       acctcon

TOTAL DURATION IS 1440 MINUTES
LINE         MINUTES  PERCENT  # SESS  # ON  # OFF
console      868      60       1       1     2
TOTALS       868      --       1       1     2

fromto 行指定报告中反映的时间段。此时间段包含自上次生成每日报告到生成当前每日报告之间的时间。然后,报告将显示有关系统重新引导、关机、电源断电恢复的日志以及由 acctwtmp 程序写入 /var/adm/wtmpx 文件的其他任何记录。有关更多信息,请参见 acct(1M) 手册页。

报告的第二部分是对终端线使用情况的细分。TOTAL DURATION 指出系统处于多用户模式(可通过终端线访问)的时间。下表介绍了每日报告所提供的数据。

LINE

终端线或访问端口。

MINUTES

在记帐期间使用该线的分钟数。

PERCENT

MINUTES 数划分的 TOTAL DURATION

# SESS

登录会话访问此线或端口的次数。

# ON

SESS 相同。(此列不再有意义。以前,此列可列出用户使用某线或端口登录的次数。)

# OFF

用户注销的次数以及该线中出现的任何中断。通常,在系统进入多用户模式后初次调用 ttymon 时,端口中会发生中断。如果 # OFF 超出 # SESS 很多,则多路复用器、调制解调器或电缆可能存在问题。或者,某处存在连接问题。最常见的原因是电缆与多路复用器的连接不牢固。

在实际使用中,应监视 /var/adm/wtmpx 文件,因为连接记帐源自该文件。如果 wtmpx 文件快速增大,请执行以下命令确定哪条 tty 线噪音最大。


# /usr/lib/acct/acctcon -l file < /var/adm/wtmpx

如果不断发生中断,则总体系统性能将受到影响。此外,还可能损坏 wtmp 文件。要更正此问题,请参见如何修复损坏的 wtmpx 文件

每日使用情况报告

每日使用情况报告按用户细分系统资源使用情况。下面是此报告的一个样例:


Jan 16 02:30 2004  DAILY USAGE REPORT FOR skisun Page 1


     LOGIN  CPU  (MINS)  KCORE-   MINS    CONNECT  (MINS) DISK   # OF   # OF  # DISK  FEE
UID  NAME   PRIME NPRIME PRIME    NPRIME  PRIME    NPRIME BLOCKS PROCS  SESS  SAMPLES
0    TOTAL  72    148    11006173 51168   26230634 57792  539    330    0     2150    1
0    root   32    76     11006164 33664   26230616 22784  0      0      0     127     0
4    adm    0     0      22       51      0        0      0      420    0     0       0
101  rimmer 39    72     894385   1766020 539      330    0      1603   1     0       0

下表描述每日使用情况报告所提供的数据。

表 10–3 每日使用情况报告数据

列 

说明 

UID

用户 ID 号。 

LOGIN NAME

用户的登录(或用户)名。标识有多个登录名的用户。  

CPU (MINS)

用户的进程使用中央处理器的时间长度(分钟)。使用情况分为 PRIMENPRIME(非主要)。此数据的记帐系统版本位于 /etc/acct/holidays 文件中。

KCORE-MINS

进程运行时每分钟所使用内存量(千字节)的累计度量。使用情况分为 PRIMENPRIME

CONNECT (MINS)

用户登录到系统的时间长度(分钟),或“实际时间”。使用情况分为 PRIMENPRIME。如果这些数字很大而 # OF PROCS 很小,则可推断出,用户早晨先登录,然后在一天的其余时间内几乎未连接终端。

DISK BLOCKS

acctdusg 程序的输出,该程序运行磁盘记帐程序并合并记帐记录 (daytacct)。用于记帐的块的大小为 512 字节。

# OF PROCS

用户调用的进程数。如果出现的数字很大,则表明用户可能有一个 shell 过程在运行时无法受到控制。 

# OF SESS

用户登录系统的次数。 

# DISK SAMPLES

运行磁盘记帐以获得 DISK BLOCKS 平均数的次数。

FEE

此字段表示 chargefee 脚本对用户收取费用的总累积单位,通常不使用此字段。

每日命令摘要

每日命令摘要报告按命令显示系统资源使用情况。通过此报告,可以确定使用率最高的命令。根据这些命令使用系统资源的方式,可以准确掌握对系统进行调优的最佳方式。

这些报告按 TOTAL KCOREMIN 排序,它是任意衡量,但常用于计算系统中的垃圾箱。

下面是一个每日命令摘要样例:


								TOTAL COMMAND SUMMARY
COMMAND   NUMBER      TOTAL   TOTAL     TOTAL   MEAN    MEAN     HOG   CHARS   BLOCKS
NAME        CMDS    KCOREMIN CPU-MIN REAL-MIN  SIZE-K  CPU-MIN  FACTOR TRNSFD  READ

TOTALS      2150  1334999.75  219.59 724258.50 6079.48   0.10   0.00   397338982 419448

netscape      43  2456898.50   92.03  54503.12 26695.51  2.14   0.00   947774912 225568
adeptedi       7    88328.22    4.03    404.12 21914.95  0.58   0.01    93155160   8774
dtmail         1    54919.17    5.33  17716.57 10308.94  5.33   0.00   213843968  40192
acroread       8    31218.02    2.67  17744.57 11682.66  0.33   0.00   331454464  11260
dtwm           1    16252.93    2.53  17716.57 6416.05   2.53   0.00   158662656  12848
dtterm         5     4762.71    1.30  76300.29 3658.93   0.26   0.00    33828352  11604
dtaction      23     1389.72    0.33      0.60 4196.43   0.01   0.55    18653184    539
dtsessio       1     1174.87    0.24  17716.57 4932.97   0.24   0.00    23535616   5421
dtcm           1      866.30    0.18  17716.57 4826.21   0.18   0.00     3012096   6490

以下列表介绍了每日命令摘要提供的数据。

COMMAND NAME

命令的名称。由于进程记帐系统只报告对象模块,因此所有 Shell 过程都集中在名称 sh 下。应对名为 a.outcore 或其他任何意外名称的程序的频率进行监视。可以使用 acctcom 程序来确定哪个用户执行了名称奇怪的命令以及是否使用了超级用户权限。

NUMBER CMDS

运行此命令的总次数。

TOTAL KCOREMIN

进程运行时每分钟所使用千字节内存段的累计度量。

TOTAL CPU-MIN

此程序累积的总处理时间。

TOTAL REAL-MIN

此程序累积的总实时(挂钟)分钟数。

MEAN SIZE-K

NUMBER CMDS 所反映的调用次数中 TOTAL KCOREMIN 的平均值(平均数)。

MEAN CPU-MIN

源自 NUMBER CMDSTOTAL CPU-MIN 的平均值(平均数)。

HOG FACTOR

CPU 总时间除以已用时间。显示系统可用性与系统使用率之比,提供进程在执行期间可用的总 CPU 时间的相对测量。

CHARS TRNSFD

由读和写系统调用传送的字符数。可能因溢出而为负值。

BLOCKS READ

一个进程执行的物理块读取和写入总数。

每月命令摘要

每日命令摘要报告的格式实际上与每月命令摘要报告的格式相同。但是,每日摘要只针对当前记帐期间进行报告,而每月摘要则针对从财务期间开始到当前日期之间的时间段进行报告。换言之,每月报告是一个累计摘要,它反映自上次调用 monacct 程序以来累积的数据。

下面是一个每月命令摘要样例。


Jan 16 02:30 2004  MONTHLY TOTAL COMMAND SUMMARY Page 1


                                     TOTAL COMMAND SUMMARY
COMMAND   NUMBER      TOTAL   TOTAL     TOTAL   MEAN     MEAN    HOG      CHARS    BLOCKS
NAME        CMDS    KCOREMIN CPU-MIN  REAL-MIN  SIZE-K   CPU-MIN FACTOR  TRNSFD    READ

TOTALS     42718  4398793.50  361.92  956039.00 12154.09 0.01    0.00  16100942848 825171

netscape     789  3110437.25  121.03   79101.12 25699.58 0.15    0.00   3930527232 302486
adeptedi      84  1214419.00   50.20    4174.65 24193.62 0.60    0.01    890216640 107237
acroread     145   165297.78    7.01   18180.74 23566.84 0.05    0.00   1900504064  26053
dtmail         2    64208.90    6.35   20557.14 10112.43 3.17    0.00    250445824  43280
dtaction     800    47602.28   11.26      15.37  4226.93 0.01    0.73    640057536   8095
soffice.      13    35506.79    0.97       9.23 36510.84 0.07    0.11    134754320   5712
dtwm           2    20350.98    3.17   20557.14  6419.87 1.59    0.00    190636032  14049

有关每月命令摘要所提供数据的描述,请参见每日命令摘要

上次登录报告

此报告给出上次进行特定登录的日期。使用此信息可以找出未使用的登录以及可以存档和删除的登录目录。下面是一个上次登录报告。


Jan 16 02:30 2004  LAST LOGIN Page 1


01-06-12  kryten         01-09-08  protoA      01-10-14  ripley
01-07-14  lister         01-09-08  protoB      01-10-15  scutter1
01-08-16  pmorph         01-10-12  rimmer      01-10-16  scutter2

使用 acctcom 检查 pacct 文件

您随时都可以使用 acctcom 程序来检查 /var/adm/pacct n 文件的内容,或含有 acct.h 格式的记录的任何文件的内容。如果运行此命令时不指定任何文件也不提供任何标准输入,acctcom 命令将读取 pacct 文件。acctcom 命令所读取的每条记录都表示有关已终止进程的信息。可通过运行 ps 命令来检查活动进程。

acctcom 命令的缺省输出提供以下信息:


# acctcom
COMMAND                           START    END          REAL     CPU    MEAN
NAME       USER     TTYNAME       TIME     TIME       (SECS)  (SECS) SIZE(K)
#accton    root      ?            02:30:01 02:30:01     0.03    0.01  304.00
turnacct   adm       ?            02:30:01 02:30:01     0.42    0.01  320.00
mv         adm       ?            02:30:01 02:30:01     0.07    0.01  504.00
utmp_upd   adm       ?            02:30:01 02:30:01     0.03    0.01  712.00
utmp_upd   adm       ?            02:30:01 02:30:01     0.01    0.01  824.00
utmp_upd   adm       ?            02:30:01 02:30:01     0.01    0.01  912.00
utmp_upd   adm       ?            02:30:01 02:30:01     0.01    0.01  920.00
utmp_upd   adm       ?            02:30:01 02:30:01     0.01    0.01 1136.00
utmp_upd   adm       ?            02:30:01 02:30:01     0.01    0.01  576.00
closewtm   adm       ?            02:30:01 02:30:01     0.10    0.01  664.00

以下列表介绍了每个字段:

COMMAND NAME

命令名称(如果以超级用户权限执行命令,则带有井号 (#))

USER

用户名

TTYNAME

tty 名称(如果未知则列为 ?

START TIME

命令执行开始时间

END TIME

命令执行结束时间

REAL (SECS)

实时(秒)

CPU (SECS)

CPU 时间(秒)

MEAN SIZE (K)

平均大小(千字节)

通过使用 acctcom 命令选项可以获得以下信息。

以下列表介绍 acctcom 命令选项。

-a

显示有关选定进程的平均统计信息。记录输出后将列显该统计信息。

-b

向后读取文件,先显示最新命令。如果读取标准输入,此选项将无效。

-f

列显 fork/exec 标志和系统退出状态列。输出是一个八进制数字。

-h

显示扰乱因子而不是平均内存大小,扰乱因子是进程在执行期间使用的总可用 CPU 时间的分数。扰乱因子 = 总 CPU 时间/已用时间

-i

列显输出中包含 I/O 计数的列。

-k

显示总 kcore minutes 而不是内存大小。

-m

显示平均核心转储大小。此大小是缺省值。

-q

列显平均统计信息,而不是输出记录。

-r

显示 CPU 因子: user-time/(system-time + user-time)

-t

显示单独的系统和用户 CPU 时间。

-v

从输出中排除列标题。

-C sec

只显示总 CPU 时间(系统加用户)超过 sec 秒的进程。

-e time

显示在 time(给定格式 hr[: min[: sec]])时或之前存在的进程。

-E time

显示在 time(给定格式 hr[: min[: sec]])时或之前开始的进程。对 -S-E 使用相同时间,以显示在该时间存在的进程。

-g group

只显示属于 group 的进程。

-H factor

只显示超出 factor 的进程,其中 factor 是“扰乱因子”(请参见 -h 选项)。

-I chars

只显示传送的字符数大于 chars 所指定的分界数的进程。

-l line

只显示属于终端 /dev/line 的进程。

-n pattern

只显示与 pattern(正则表达式,只是 "+" 表示出现一次或多次)匹配的命令。

-o ofile

不列显记录,而以 acct.h 格式将其复制到 ofile 文件中。

-O sec

只显示 CPU 系统时间超出 sec 秒的进程。

-s time

显示在 time(给定格式 hr[: min[: sec]])时或之后存在的进程。

-S time

显示在 time(给定格式 hr[: min[: sec]])时或之后开始的进程。

-u user

只显示属于 user 的进程。

系统记帐文件

/var/adm 目录包含活动的数据收集文件。下表介绍了此目录中的记帐文件。

dtmp

acctdusg 程序的输出

fee

chargefee 程序的输出,该输出为 ASCII tacct 记录

pacct

活动进程记帐文件

pacct n

通过运行 turnacct 脚本切换的进程记帐文件

Spacctn. MMDD

执行 runacct 脚本期间用于 MMDD 的进程记帐文件

/var/adm/acct 目录包含 nitesumfiscal 目录。这些目录包含实际的数据收集文件。例如,nite 目录包含 runacct 脚本每天重用的文件。下面是 /var/adm/acct/nite 目录中文件的简短摘要。

表 10–4 /var/adm/acct/nite 目录中的文件

文件 

说明 

active

runacct 脚本用来记录进度并列显警告和错误消息

active.MMDD

runacct 脚本检测到错误后的 active 文件相同

cms

prdaily 脚本使用的 ASCII 总命令摘要

ctacct.MMDD

tacct.h 格式的连接记帐记录

ctmp

acctcon1 程序的输出,其中包括 ctmp.h 格式的连接会话记录(提供 acctcon1acctcon2 是为了兼容)

daycms

prdaily 脚本使用的 ASCII 每日命令摘要

daytacct

tacct.h 格式的一天总记帐记录

disktacct

tacct.h 格式的磁盘记帐记录,由 dodisk 脚本创建

fd2log

执行 runacct 脚本期间的诊断输出

lastdate

上次执行 runacct 脚本的日期(以 date +%m%d 格式)

lineuse

prdaily 脚本使用的 tty 线使用情况报告

lock

用于控制 runacct 脚本的串行使用

log

acctcon 程序的诊断输出

log.MMDD

runacct 脚本检测到错误后的 log 文件相同

owtmpx

前一天的 wtmpx 文件

reboots

wtmpx 文件中的开始和结束日期,以及重新启动的列表

statefile

用于在执行 runacct 脚本期间记录当前状态

tmpwtmp

wtmpfix 程序更正的 wtmpx 文件

wtmperror

包含 wtmpfix 错误消息

wtmperror MMDD

runacct 脚本检测到错误后的 wtmperror 文件相同

wtmp MMDD

runacct 脚本的 wtmpx 文件副本

sum 目录中包含由 runacct 脚本更新并由 monacct 脚本使用的累积摘要文件。下表汇总了 /var/adm/acct/sum 目录中的文件。

表 10–5 /var/adm/acct/sum 目录中的文件

文件 

说明 

cms

当前财务期间的二进制格式的总命令摘要文件  

cmsprev

没有最新更新的命令摘要文件  

daycms

表示日使用情况的内部摘要格式的命令摘要文件  

loginlog

用户上次登录日期的记录;由 lastlogin 脚本创建,在 prdaily 脚本中使用

rprt.MMDD

已保存的 prdaily 脚本的输出

tacct

当前财务期间的累计总记帐文件  

tacctprev

与没有最新更新的 tacct 文件相同

tacct.MMDD

MMDD 的总记帐文件

fiscal 目录中包含由 monacct 脚本创建的定期摘要文件。下表汇总了 /var/adm/acct/fiscal 目录中的文件。

表 10–6 /var/adm/acct/fiscal 目录中的文件

文件 

说明 

cmsn

财务期间 n 的内部摘要格式的总命令摘要文件

fiscrptn

与财务期间 nrprtn 类似的报告

tacctn

财务期间 n 的总记帐文件

runacct 脚本生成的文件

下表汇总了由 runacct 脚本生成的最有用的文件。这些文件位于 /var/adm/acct 目录中。

表 10–7 runacct 脚本创建的文件

文件  

说明 

nite/daytacct

某日的 tacct.h 格式的总记帐文件。

nite/lineuse

runacct 脚本调用 acctcon 程序以从 /var/adm/acct/nite/tmpwtmp 文件中收集有关终端线使用情况的数据,并将数据写入 /var/adm/acct/nite/lineuse 文件。prdaily 脚本使用此数据来报告线使用情况。此报告对于检测故障线特别有用。如果退出数与登录数之比大于三比一,该线很可能出现了故障。

sum/cms

此文件是每天的命令摘要的累积。该累积在 monacct 脚本执行时重新启动。ASCII 版本是 nite/cms 文件。

sum/daycms

runacct 脚本调用 acctcms 程序以处理该日使用的命令,从而创建每日命令摘要报告并将数据存储在 /var/adm/acct/sum/daycms 文件中。ASCII 版本是 /var/adm/acct/nite/daycms 文件。

sum/loginlog

runacct 脚本调用 lastlogin 脚本,以便对 /var/adm/acct/sum/loginlog 文件中的登录更新上次登录日期。lastlogin 命令还从此文件中删除不再有效的所有登录。

sum/rprt.MMDD

每次执行 runacct 脚本都会保存 prdaily 脚本所列显的每日报告的副本。

sum/tacct

包含每天的 nite/daytacct 数据的累积并用于记帐目的。monacct 脚本在每月或每个财务期间重新开始累积此数据。