本章提供有关系统记帐的参考信息。
以下是本章中参考信息的列表。
有关系统记帐任务的更多信息,请参见第 9 章。
主要的每日记帐脚本 runacct 通常由 cron 命令在正常工作时间之外调用。runacct 脚本可以处理连接、费用、磁盘和进程记帐文件。此脚本还可准备每日摘要文件和累积摘要文件,以供 prdaily 和 monacct 脚本记帐。
使用一系列保护机制来执行以下任务:
识别错误
提供智能诊断
以特定方式完成处理,从而以最少的介入重新启动 runacct 脚本
该脚本通过向 active 文件中写入描述性消息来记录其进度。除非另有说明,否则假定 runacct 脚本所使用的文件位于 /var/adm/acct/nite 目录中。runacct 脚本执行期间的所有诊断输出都写入 fd2log 文件中。
调用 runacct 脚本时,将会创建 lock 和 lock1 文件。这些文件可防止同时执行 runacct 脚本。如果调用 runacct 程序时已经存在上述文件,则该程序将列显错误消息。lastdate 文件中包含上次调用 runacct 脚本的月份和日期,以避免每天多次执行脚本。
如果 runacct 脚本检测到错误,则会发生以下情况:
向控制台写入一条消息
向 root 和 adm 发送电子邮件
可能删除锁定
保存诊断
执行结束
有关如何重新启动 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 文件。closewtmp 和 utmp2wtmp 程序将向 wtmp.MMDD 文件和新的 wtmpx 文件中添加记录,以便 对当前登录的用户进行说明。 |
WTMPFIX |
wtmpfix 程序检查 nite 目录中的 wtmp.MMDD 文件是否正确。由于某些日期更改会导致 acctcon 程序失败,所以 wtmpfix 程序会在有日期更改记录时尝试调整 wtmpx 文件中的时间标记。此程序还可删除 wtmpx 文件中的任何已损坏项。将 wtmp.MMDD 文件的已修复版本写入 tmpwtmp 文件。 |
CONNECT |
acctcon 程序用于在文件 ctacct.MMDD 中记录连接记帐记录。这些记录使用 tacct.h 格式。此外,acctcon 程序还创建 lineuse 和 reboots 文件。reboots 文件会记录在 wtmpx 文件中找到的所有引导记录。 |
PROCESS |
acctprc 程序用于将 /var/adm/Spacctn.MMDD 进程记帐文件转换为 ptacctn.MMDD 文件中的完整记帐记录。Spacct 和 ptacct 文件通过数字进行关联,这样在 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/daycms 和 nite/cms,即分别来自 sum/daycms 和 sum/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 |
from 和 to 行指定报告中反映的时间段。此时间段包含自上次生成每日报告到生成当前每日报告之间的时间。然后,报告将显示有关系统重新引导、关机、电源断电恢复的日志以及由 acctwtmp 程序写入 /var/adm/wtmpx 文件的其他任何记录。有关更多信息,请参见 acct(1M) 手册页。
报告的第二部分是对终端线使用情况的细分。TOTAL DURATION 指出系统处于多用户模式(可通过终端线访问)的时间。下表介绍了每日报告所提供的数据。
终端线或访问端口。
在记帐期间使用该线的分钟数。
按 MINUTES 数划分的 TOTAL DURATION。
登录会话访问此线或端口的次数。
与 SESS 相同。(此列不再有意义。以前,此列可列出用户使用某线或端口登录的次数。)
用户注销的次数以及该线中出现的任何中断。通常,在系统进入多用户模式后初次调用 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 每日使用情况报告数据
每日命令摘要报告按命令显示系统资源使用情况。通过此报告,可以确定使用率最高的命令。根据这些命令使用系统资源的方式,可以准确掌握对系统进行调优的最佳方式。
这些报告按 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 |
以下列表介绍了每日命令摘要提供的数据。
命令的名称。由于进程记帐系统只报告对象模块,因此所有 Shell 过程都集中在名称 sh 下。应对名为 a.out、core 或其他任何意外名称的程序的频率进行监视。可以使用 acctcom 程序来确定哪个用户执行了名称奇怪的命令以及是否使用了超级用户权限。
运行此命令的总次数。
进程运行时每分钟所使用千字节内存段的累计度量。
此程序累积的总处理时间。
此程序累积的总实时(挂钟)分钟数。
在 NUMBER CMDS 所反映的调用次数中 TOTAL KCOREMIN 的平均值(平均数)。
源自 NUMBER CMDS 和 TOTAL CPU-MIN 的平均值(平均数)。
CPU 总时间除以已用时间。显示系统可用性与系统使用率之比,提供进程在执行期间可用的总 CPU 时间的相对测量。
由读和写系统调用传送的字符数。可能因溢出而为负值。
一个进程执行的物理块读取和写入总数。
每日命令摘要报告的格式实际上与每月命令摘要报告的格式相同。但是,每日摘要只针对当前记帐期间进行报告,而每月摘要则针对从财务期间开始到当前日期之间的时间段进行报告。换言之,每月报告是一个累计摘要,它反映自上次调用 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 程序来检查 /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 |
以下列表介绍了每个字段:
命令名称(如果以超级用户权限执行命令,则带有井号 (#))
用户名
tty 名称(如果未知则列为 ?)
命令执行开始时间
命令执行结束时间
实时(秒)
CPU 时间(秒)
平均大小(千字节)
通过使用 acctcom 命令选项可以获得以下信息。
fork/exec 标志的状态(1 表示不带 exec 的 fork)
系统退出状态
扰乱因子
kcore 总分钟数
CPU 因子
传送的字符
已读的块
显示有关选定进程的平均统计信息。记录输出后将列显该统计信息。
向后读取文件,先显示最新命令。如果读取标准输入,此选项将无效。
列显 fork/exec 标志和系统退出状态列。输出是一个八进制数字。
显示扰乱因子而不是平均内存大小,扰乱因子是进程在执行期间使用的总可用 CPU 时间的分数。扰乱因子 = 总 CPU 时间/已用时间。
列显输出中包含 I/O 计数的列。
显示总 kcore minutes 而不是内存大小。
显示平均核心转储大小。此大小是缺省值。
列显平均统计信息,而不是输出记录。
显示 CPU 因子: user-time/(system-time + user-time)。
显示单独的系统和用户 CPU 时间。
从输出中排除列标题。
只显示总 CPU 时间(系统加用户)超过 sec 秒的进程。
显示在 time(给定格式 hr[: min[: sec]])时或之前存在的进程。
显示在 time(给定格式 hr[: min[: sec]])时或之前开始的进程。对 -S 和 -E 使用相同时间,以显示在该时间存在的进程。
只显示属于 group 的进程。
只显示超出 factor 的进程,其中 factor 是“扰乱因子”(请参见 -h 选项)。
只显示传送的字符数大于 chars 所指定的分界数的进程。
只显示属于终端 /dev/line 的进程。
只显示与 pattern(正则表达式,只是 "+" 表示出现一次或多次)匹配的命令。
不列显记录,而以 acct.h 格式将其复制到 ofile 文件中。
只显示 CPU 系统时间超出 sec 秒的进程。
显示在 time(给定格式 hr[: min[: sec]])时或之后存在的进程。
显示在 time(给定格式 hr[: min[: sec]])时或之后开始的进程。
只显示属于 user 的进程。
/var/adm 目录包含活动的数据收集文件。下表介绍了此目录中的记帐文件。
acctdusg 程序的输出
chargefee 程序的输出,该输出为 ASCII tacct 记录
活动进程记帐文件
通过运行 turnacct 脚本切换的进程记帐文件
执行 runacct 脚本期间用于 MMDD 的进程记帐文件
/var/adm/acct 目录包含 nite、sum 和 fiscal 目录。这些目录包含实际的数据收集文件。例如,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 格式的连接会话记录(提供 acctcon1 和 acctcon2 是为了兼容) |
daycms |
prdaily 脚本使用的 ASCII 每日命令摘要 |
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 文件相同 |
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 |
与财务期间 n 的 rprtn 类似的报告 |
tacctn |
财务期间 n 的总记帐文件 |
下表汇总了由 runacct 脚本生成的最有用的文件。这些文件位于 /var/adm/acct 目录中。
表 10–7 runacct 脚本创建的文件
文件 |
说明 |
---|---|
某日的 tacct.h 格式的总记帐文件。 |
|
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 脚本在每月或每个财务期间重新开始累积此数据。 |