使用 AIX 记帐
2008-11-10 08:24:21 来源:WEB开发网开始之前
本教程适用于熟悉 Shell 编程、并希望启用和使用 UNIX® 记帐功能的 AIX® 管理员。我们假定您已掌握 UNIX 文本编辑器的使用。
引言
在本教程中,研究了各种 AIX 记帐类型,如何启用它们,如何生成报告,以及如何自定义报告信息,以便用于系统监视和使用收费。使用收费表示根据客户或部门对系统资源、系统管理员时间、或者原始材料(例如,打印纸)的使用情况进行收费。
记帐定义为记录、汇总和报告有关系统活动和资源使用情况的信息。
AIX 记帐提供一种方法进行监视及核对来自单个或多个系统的系统资源使用情况。然后,您可以将该信息用于各种目的,如:
确定忙时间段或各个系统和个别的使用情况。
分析相关趋势,并进行容量规划。
确定潜在的问题,如失控进程或磁盘空间的大量占用者。
对于多个成本中心或部门所共享的服务器,可以创建退款记录,以便根据不同用户或部门对计算机时间和资源的使用情况按比例进行费用分摊。
记录这些资源的使用情况(如特殊项目使用系统管理员时间和打印机的情况)。
能够确定在某个特定时间段内正由谁执行哪些进程,可用于取证分析或者监视用户的活动。
让我们首先简单描述各种不同的记帐类型,并在后面的部分中详细地说明如何启用它们,然后通过自定义的示例来了解它们的报告功能。
先决条件
本教程的示例是在运行 AIX 5L™ Version 5.2 的 RS/6000® 系统中开发的。命令示例使用了 Korn Shell。
本教程以及其中的示例是专门针对 AIX 编写的。尽管在许多 UNIX 变体中,记帐功能比较常见,但是其设置过程,尤其是对于具体的命令和数据目录,可能有所不同。对于非 AIX 平台,请参考特定 UNIX 版本的操作系统文档。
记帐功能概述
UNIX 记帐负责记录和报告系统资源使用情况和活动。计算机的资源主要包括下列关键部分:
CPU
内存
磁盘
I/O 设备
在这一部分中,先对不同记帐类型进行概述,然后深入研究如何在 AIX 系统中设置和启用每种记帐类型。
记帐类型
下面是记帐类型的列表:
进程记帐
连接时间记帐
磁盘使用情况记帐
打印机使用情况记帐
费用记帐
在下面的部分中,您将了解如何:
演练每种类型
启用某种记帐类型
了解它记录了哪些信息
报告所收集的数据
您可以启用或禁用进程记帐、连接时间记帐和打印机使用情况记帐。磁盘使用情况记帐数据已经存储在文件系统中。尽管这些记帐程序为计费的目的和系统监视提供了数据,但它们本身也会消耗系统资源。例如,每当一个进程完成需要的磁盘 I/O 时,要将一条记录写入到磁盘,并且存储这些记录也需要消耗磁盘空间。另外,生成进程记帐报告也需要使用一定的 CPU 时间。总之,对于记帐来说,系统资源成本是非常小的。如果您发现在启用了某种记帐类型之后出现了性能问题,那么您可能需要权衡收集这些数据与系统性能之间的重要性。另外,可以对夜间的报告任务进行调整,使其在不同的时间运行,避免它们与其他的进程之间产生冲突。
基本的数据流
记帐的基本数据流和报告与以下所示类似:
一个进程将所需的数据收集到一个文件中。
可以使用各种命令来查看这些原始数据。
一个夜间的 cron 任务 runacct,将这些原始文件合并到总计记帐记录文件(tacct 文件),创建报告,并将这些 tacct 文件添加到汇总 tacct 文件。
一项月末的任务 monacct,对这个汇总 tacct 文件进行处理,得到一个月度的报告。它还负责清除前一个月的数据。
您可以创建自己的命令,以用于自定义报告或修改现有的报告。
进程记帐
这一部分向您介绍了如何设置进程记帐以及完成一些命令行的报告。
进程记帐概述
顾名思义,进程记帐负责记录系统中执行的每个进程的相关信息。然后,可以对该数据进行组合,以生成单独的命令和用户使用情况的报告。这些报告可以用于跟踪资源使用、工作效率、评估进程计划,以及用于计费的目的。
还可以对该数据进行细化,以确定在该系统中,哪些用户在某个特定的时间执行了哪些命令、以及某个特定的用户在某个特定的时间执行了哪些命令。当进行系统取证(如研究潜在的安全漏洞、或者系统误用的情况)时,该信息可能非常有价值。
在启用了进程记帐之后,内核会为每个完成的进程写入一条记录到 /usr/adm/pacct 文件。该记录包括:
用户 ID 的相关数据
命令的名称
CPU 和内存使用情况
启动和停止时间
磁盘读和写
字符 I/O
报告程序可以对文件中的数据进行组合和格式化,并生成每天的和每月的报告。在启动和停止记帐时,或者通过运行夜间的记帐任务 runacct,您可以定义记帐时间段的长度。
有关夜间报告的内容,将在夜间记帐报告部分中进行更深入的讨论。
启用进程记帐
在缺省情况下,在 AIX 系统中并没有安装或者设置进程记帐。这一部分描述了激活进程记帐并使用进程记帐报告所需的步骤。稍后将详细介绍我所做的工作,并且您将对数据的收集和报告进程进行优化。有关特定命令的更详细的信息,您可以参考相应的手册页面(请参见参考资料部分)。
尽管大多数进程记帐活动使用用户“adm”运行,但大多数命令需要以“root”的身份运行。
检查系统中是否安装了进程记帐。进程记帐命令与 bos.acct 文件集一同安装。可以使用下面的命令查看是否安装了该文件集:# lslpp -L bos.acct
您还可以使用 SMIT> Software Installation and Maintenance > List Software and Related Informantion > List Installed Software 并指定“bos.acct”作为软件的名称。如果尚未安装,那么请使用 SMIT 或 installp 从您的分发介质中安装它。因为内核挂钩已经驻留,所以不需要进行内核编译或者重新启动。
检查文件系统空间。原始数据文件以及经过处理的报告位于 /var/adm。尽管所使用的文件系统空间很少(在活动的系统中,每天仅使用几兆字节),但如果您需要联机保存历史数据,那么它将无限制的增长。如果这个文件系统达到了某个阈值,进程记帐将会中止。如果这个文件系统被占满了,那么其他需要写入 /var 的进程可能会碰到问题。计算您在 /var 文件系统中所拥有的空间,可以考虑是否需要为 /var/adm 创建一个单独装入的文件系统,还应该考虑是否需要设置一个定时清理 /var 中文件的清理例程。
检查记帐文件和目录。在缺省情况下并没有设置这些内容,所以您需要创建它们,并且它们应该属于 adm 用户和组。发出下面的命令,如清单 1 中所示。
清单 1. 创建记帐文件和目录
# cd /var/adm
# /usr/sbin/acct/nullacct pacct
# chown adm.adm acct
# chmod 775 acct
# su adm
$ cd acct
$ mkdir fiscal nite sum
$ chmod 775 fiscal nite sum
$ exit
编辑 /etc/acct/holidays 文件(请参见清单 2)。这个文件用于为计费目的指定“黄金时段 (prime time)”,以及一年当中的哪些日子是节假日,而不作为“黄金时段”。
清单 2. 编辑 /etc/acct/holidays 文件
$ cat holidays
* Prime/Nonprime Table for AIX Accounting System
*
* Curr Prime Non-Prime
* Year Start Start
*
1998 0800 1700
*
* Day of Calendar Company
* Year Date Holiday
*
1 Jan 1 New Year's Day
47 Feb 16 Presidents' Day
100 Apr 10 Spring Holiday
145 May 25 Memorial Day
184 Jul 3 Independence Day
250 Sep 7 Labor Day
330 Nov 26 Thanksgiving Day
331 Nov 27 Day after Thanksgiving
359 Dec 25 Christmas
很明显,这个缺省的文件是专门针对美国的,并且它非常陈旧。可以对其进行编辑,以使之符合当前年份、公司的工作日(指定何时为“黄金时段”)、以及节假日计划。进程记帐仅检查公司节假日的“Day of Year”字段,其余的字段只是注释而已。请记住闰年,并对该年中的日期进行相应的调整。星期六和星期日通常不作为“黄金时段”。当这个 holidays 文件过期(进入了新的一年、或者过了该年中的最后一个节假日)时,将会向 root 和 adm 发送一封电子邮件,并将一条消息存储在 /var/adm/acct/nite/accterr 中。
进行相应的设置,以便在系统启动时自动地启动记帐功能。编辑 /etc/rc 文件,并在末尾添加下面一行内容:/usr/bin/su -s adm -c /usr/sbin/acct/startup
通过重新启动系统或发出下面的命令来启动进程记帐:# /usr/bin/su -s adm -c /usr/sbin/acct/startup
通过检查 /var/adm/pacct 文件,并观察该文件的大小不再为零,可以验证已经启动了记帐功能(请参见清单 3)。
清单 3. 验证记帐功能已经启动
# ls -l /var/adm/pacct
-rw-rw-r-- 1 adm adm 6080 Dec 20 23:11 /var/adm/pact
删除 /usr/lib/cron/cron.deny 文件,并编辑 /usr/lib/cron/cron.allow 文件。添加用户“adm”,以便用户“adm”能够运行 cron 任务。
在 adm 的 crontab 文件中取消 /usr/lib/acct/ckpacct 行的注释(请参见清单 4)。注意:有些命令被指定位于 /usr/sbin/acct,而有些则位于 /usr/lib/acct。/usr/lib/acct 是命令文件的常规位置,并且 /usr/lib/acct 中的命令符号链接到 /usr/sbin/acct 中的命令,以保持对遗留的记帐软件包的向后兼容性。
清单 4. 在 adm 的 crontab 文件中取消 /usr/lib/acct/ckpacct 行的注释
# crontab -e adm
#=================================================================
# PROCESS ACCOUNTING:
# runacct at 11:10 every night
# dodisk at 11:00 every night
# ckpacct every hour on the hour
# monthly accounting 4:15 the first of every month
#=================================================================
#10 23 * * * /usr/lib/acct/runacct 2>/usr/adm/acct/nite/accterr > /dev/console
#0 23 * * * /usr/lib/acct/dodisk > /dev/console 2>&1
0 * * * * /usr/lib/acct/ckpacct > /dev/console 2>&1
#15 4 1 * * /usr/lib/acct/monacct > /dev/console 2>&1
#=================================================================
/usr/lib/acct/ckpacct 可以检查 /var/adm/pacct 文件的大小。如果它超过了 1000 个磁盘块,ckpacct 将调用“turnacct switch”来关闭当前的 pacct 文件,使用唯一的名称(如 pacct1)对其进行重命名,然后打开一个新的 pacct 文件。这是为了保持 pacct 文件不超过可管理的大小。“ckpacct”还将检查 /var/adm 中空闲空间的大小,如果小于 500 个磁盘块,将使用“turnacct off”关闭进程记帐。
注意:当 pacct 文件的大小超过 1000 个磁盘块时,ckpacct 将对其进行切换。这是一个遗留值。尽管以前认为这个值代表了很大的磁盘空间,但是现在还不及一个软盘的容量大小。可以通过在 crontab 中调用命令(如“ckpacct 400000”),重写这个缺省值。
现在暂时不用关心其他的行,稍后将在磁盘使用情况记帐和 runacct 部分中对它们进行介绍。
编辑 /usr/sbin/acct/ckpacct Shell 脚本,取消 MAILCOM 行的注释,并包括在“ckpacct”需要更改进程记帐时应该接收电子邮件的任何附加登录:MAILCOM = "mail root adm" to send mail to root adm
当 /var/adm 的空间不够时(记帐功能关闭)、当 /var/adm 重新获得了空间时(记帐功能开启)、或者当进程记帐文件的大小增加时(记帐文件切换),都将发送邮件。
进程记帐报告
/var/adm/pacct 文件包含系统中已经完成的(或者被终止的)每个进程的相关原始数据。大多数进程记帐报告由 runacct 和 monacct 进行处理,稍后将介绍该内容。这些程序根据命令名称和用户对数据进行整合。
您可以使用 prtacct 命令(例如,prtacct /var/adm/pracct)查看收集到 pacct 中的原始数据。要以更适合阅读的格式查看数据,可以尝试 acctcom。本文将在示例部分中对这个命令进行更详细的描述。
连接时间记帐
连接时间记帐记录了用户登录和注销时的相关信息,以及执行终端活动的数量。操作系统从 init、getty 以及登录程序中收集这些信息,并将其保存到 /var/adm/wtmp。连接时间记帐信息可用于根据连接时间对用户进行计费,或者用于发现各种系统问题,如过于活跃的终端。在这一部分中,将了解如何启用和使用连接时间记帐以及进行报告。
启用连接时间记帐
init、getty 和登录程序生成连接时间记帐数据,这些程序将该信息存储到 /var/adm/wtmp 中。清空 wtmp 文件,并确保它具有正确的拥有者、组和权限:# /usr/sbin/acct/nulladm /var/adm/wtmp
连接时间报告
现在,让我们开始通过 last 命令来使用连接时间。last 命令可以报告从清空 wtmp 文件时开始的用户登录和系统重启信息。清单 5 中显示了它所完成的工作。
清单 5. last 命令
$ last
bozo pts/3 192.168.0.10 Jan 04 23:58 still logged in.
doug pts/3 192.168.0.10 Jan 04 23:57 - 23:58 (00:00)
monroe pts/2 192.168.0.4 Jan 04 23:56 still logged in.
root dtremote 192.168.0.4:0 Jan 04 23:55 still logged in.
reboot ~ Jan 04 23:54
shutdown lft0 Jan 04 23:50
root dtremote 192.168.0.4:0 Jan 04 21:23 - 23:50 (02:26)
monroe pts/0 192.168.0.4 Jan 04 20:47 - 23:50 (03:02)
monroe pts/0 192.168.0.102 Jan 04 14:58 - 17:10 (02:11)
root dtremote 192.168.0.4:0 Jan 04 14:27 - 14:29 (00:01)
root pts/0 192.168.0.4:0.0 Jan 03 22:42 - System is halted by
system administrator. (1+01:07)
root dtremote 192.168.0.4:0 Jan 03 22:42 - 12:42 (14:00)
wtmp begins Jan 04 04:00
runacct 将前一天的 wtmp 文件存储到 /var/adm/acct/nite/owtmp 中。通过运行带 -f 选项的 last 命令并且指定一个文件(请参见清单 6),您可以获得从前一天开始的最近的登录信息。
清单 6. 带 -f 选项的 last 命令
$ last -f /var/adm/acct/nite/owtmp
root pts/0 192.168.0.4:0.0 Jan 03 22:42 - 22:42 (00:00)
root dtremote 192.168.0.4:0 Jan 03 22:42 - 22:42 (00:00)
monroe ftp 192.168.0.4 Jan 03 23:59 - 00:01 (00:02)
root dtremote 192.168.0.4:0 Jan 03 22:42 - 22:42 (00:00)
wtmp begins Jan 03 04:00
夜间任务 runacct,调用 acctcon1 和 acctcon2 来处理夜间汇总报告的数据。runacct 还对 wtmp 文件进行重置,但 wtmp 仍然可以跟踪在 runacct 运行时登录的用户。将在 runacct 部分中对这个内容进行介绍。
磁盘使用情况记帐
磁盘使用情况记帐提供了每个用户占用磁盘空间大小的相关信息。该信息来源于文件的索引节点。在文件系统中启用磁盘使用情况记帐,实际上是启用 runacct 以便自动地收集和报告这些数据。可以对单个的文件系统进行设置。这些记帐信息可以用于确定磁盘资源的大量占用者、根据磁盘使用情况进行收费、或者为将来的扩展进行规划。在这一部分中,将了解如何启用和使用连接时间记帐以及进行报告。
启用磁盘使用情况记帐
下面的命令以 root 用户的身份来运行:
对于希望通过夜间任务来进行监视的每个文件系统,可以在 /etc/filesystems 文件中 account = true 添加所需的文件系统条目。清单 7 中给出了一个这样的示例。
清单 7. 将 account = true 添加到 /etc/filesystems 文件
/home:
dev = /dev/hd1
vol = "/home"
mount = true
check = true
free = false
vfs = jfs
log = /dev/hd8
account = true
删除 /usr/lib/cron/cron.deny 文件并编辑 /usr/lib/cron/cron.allow 文件。添加用户“adm”,以便用户“adm”可以运行 cron 任务。
通过运行“crontab -e adm”并取消下面一行注释,启用 adm 的 crontab 文件中的“dodisk”行:0 23 * * * /usr/lib/acct/dodisk > /dev/console 2>&1
这样就可以将磁盘使用情况记录收集到 /var/adm/dtmp 中,并且在 11:00 PM 将总计记帐记录记载到 var/adm/acct/nite/dacct 中。
将“dodisk”设置为每天运行一次,可以在特定时间对磁盘使用情况进行快照。要获得全天的磁盘使用情况平均值的报告,可以对“dodisk”进行设置以使其更频繁地运行,比如每小时。
磁盘使用情况记帐报告
使用 diskusg,您可以生成文件系统中不同用户的空间使用量的报告。diskusg 命令可以显示特定文件系统中每个用户所使用的磁盘块数目(请参见清单 8)。您可以指定任何文件系统块设备(不是装入点),无论是否已将“account = true”条目添加到了文件系统描述中。指定多个块设备将生成使用情况的总和。
清单 8. 使用 diskusg 命令
# /bin/df /home /usr/local
Filesystem 512-blocks Free %Used Iused %Iused Mounted on
/dev/hd1 3276800 2694768 18% 220 1% /home
/dev/lv00 6029312 1400776 77% 104066 14% /usr/local
# diskusg /dev/hd1
0 root 46
2 bin 1
100 guest 1
101 monroe 476690
202 doug 33
210 freeware 2
# diskusg /dev/hd1 /dev/lv00
0 root 489286
2 bin 1
100 guest 1
101 monroe 3909986
202 doug 33
210 freeware 485890
在最后一次 diskusg 的执行结果中,可以看到 monroe 用户使用了多少磁盘空间。有时需要检查这个使用情况是否合法,或者该用户是否应该删除一些数据。
cron 中运行的 dodisk 命令可以为 runacct 创建所需的记录,以便将该信息合并到夜间的记帐报告中。这个内容将在 runacct 部分中介绍。
打印记帐
打印记帐记录了各种打印任务的打印机使用情况(任务和页面计数)。可以为每个打印队列启用打印记帐。您还可以为特殊用途自定义打印队列报告,如信笺标题或货品计价、任务跟踪、计费、或者打印库存控制。
启用打印记帐
要对打印机进行打印记帐,需要在打印机定义文件中添加一行内容。对于希望启用打印记帐的每台打印机,需要为 /etc/qconfig 文件所指定的每个打印机队列添加一个记帐文件定义,如“acctfile = /var/adm/qacct”。清单 9 中包含了一个示例。
清单 9. 在 /etc/qconfig 中启用打印记帐
lp0:
acctfile = /var/adm/qacct
discipline = fcfs
up = TRUE
device = dlp0
您还可以通过在 SMIT 中使用菜单路径 System Management > Print Spooling > AIX Print Spooling > Change/Show Accounting File Name 来启用它。有关使用 SMIT 的文章,请参见参考资料部分。
在启用之后,会将每个打印任务的记录追加到打印队列记帐文件中。您可以选择为每台打印机设置单独的打印队列记帐文件、或者将多个打印机组织到一个记帐文件中。
runacct 将查看 /var/adm/qacct。如果您为不同的打印机使用不同的记帐文件,那么需要对 runacct 进行修改,以便按照这种方式进行记帐。
对打印记帐进行报告
使用 pac 命令可以为打印记帐生成报告。清单 10 显示了一个示例。
清单 10. pac 命令
# pac
Login pages/feet runs price
doug 2.00 1 USD .04
monroe 13.00 2 USD .26
root 1.00 1 USD .02
total 16.00 4 USD .32
在缺省情况下,pac 将显示系统缺省打印机的所有记录,并且指定每个页面的价格为 $0.02。如果您有一个“信件”打印机队列,专门打印公司昂贵的信笺标题,那么您可以在命令行中指定这个打印队列及其价格。清单 11 显示了一个示例。
清单 11. 用于特定打印机的 pac 命令,并且每页的价格不同
# pac -p.10 -Pletter
Login pages/feet runs price
doug 2.00 1 USD .20
请参阅 pac 的手册页面以了解所有可用的选项(有关链接,请参见参考资料部分)。
您可以将多个系统的队列记帐文件连接到一个文件中,以便进行整合计费。
打印记帐报告是基于队列记帐文件中的条目累积的。在运行了最后的报告之后,您需要创建当前记帐文件的汇总文件,并将这个打印记帐文件清零。可以使用 pac -s 来完成这项任务。runacct 还可以在夜间执行该任务。
所以,让我们假设您有一台网络打印机“laserjet”,挂在 Jetdirect 卡上,并在三个系统之间共享。您希望将所有的记帐信息集中到一起并创建计费报告。完成这项任务的一种方法是,让其中的两个系统远程打印到能够生成报告的系统。这种方案至少有两个缺点:如果主系统宕机,那么所有的人都无法打印(毕竟,这正是您使用网络共享打印机的原因),并且在使用这种方案时,用户名将以 bozo@sysA 的形式出现,因此无法将某个用户的所有打印条目合并到一行中。
更合适的方法是,在这些系统中分别启用打印记帐,然后创建一个类似清单 12 中所示的脚本。
清单 12. 合并来自多个系统的打印记帐数据
#!/usr/bin/ksh
/usr/bin/rsh sysA "cat /var/adm/qacct" >> /var/adm/qacct
/usr/bin/rsh sysB "cat /var/adm/qacct" >> /var/adm/qacct
pac -qlaserjet > pac.out
pac -qlaserjet -s
/usr/bin/rsh sysA "pac -qlaserjet -s"
/usr/bin/rsh sysB "pac -qlaserjet -s"
这将创建一个“pac.out”文件,其中包括这段时间的打印机记帐报告。您可以将该脚本包含到夜间或者每个月的记帐汇总中,或者将其作为独立的任务。
费用记帐
管理员在白天有许多工作需要完成。其中许多工作与用户的特殊任务有关,如恢复不小心删除的文件。如果能够对为用户提供支持所需的额外时间进行收费,有时是很有价值的。管理员可以使用 chargefee 命令对为特定的用户提供的服务进行收费。它可以用于对特殊服务进行收费,或者跟踪大量耗费系统管理员时间的用户(该用户可能需要参加培训班)。在这一部分中,将了解如何启用和使用费用记帐。
费用记帐
实际上并没有很多需要设置的内容。当管理员希望对一个用户的某项活动“收费”时,他们可以发出 # /usr/sbin/acct/chargefee username number 命令,其中的 username 是用户的登录名,而 number 是向该用户收费的单位数。chargefee 将其数据写入到 /var/adm/fee 文件。
费用报告
通常由 runacct 来处理费用报告。它将费用记帐文件合并到每日总计 (Daily Total) 记帐文件中。并在每日使用情况记帐 (Daily Usage Accounting) 报告页面中产生相应的结果。
费用记帐的一个明显的限制是,没有对所记录的服务提供描述。假设一个牢骚满腹的成本中心管理人员总在抱怨对他的“收费”,而他需要知道为他提供了哪些服务以及何时提供的服务,以便对开支进行核实。为了实现此目标,除了运行 chargefee 命令之外,您可以编写一个包装程序来记录这些信息。自定义报告部分中提供了该命令的一个示例。或者,您可以组合使用不同的服务计费包,并且从 runacct 删除费用记帐。
夜间记帐报告
可以使用 runacct 生成夜间的和每个月的记帐报告,可以编写一个能够在夜间运行以产生各种记帐数据的汇总报告的 Shell 脚本。它将所有的记录转换为总计记帐记录 (tacct),然后将其合并,并保存到月底。在下一部分中,将介绍如何运行 runacct(夜间记帐报告)和 monacct(每个月的记帐报告)。
启用 runacct 的夜间运行
现在,将 runacct 设置为运行,然后检查其结果。
执行下面的步骤以启用 runacct 的夜间运行:
编辑 root 的 crontab 文件,并添加一个条目以运行 runacct 和 monacct(请参见清单 13)。
清单 13. 编辑 crontab 文件以启用夜间的和每个月的报告
# crontab -e
00 4 * * 1-6 /usr/sbin/acct/runnacct 2>/var/adm/acct/nite/accterr
15 5 1 * * /usr/sbin/acct/monacct 2> /var/adm/acct/fiscal/monaccterr
在这个示例中,您将 runacct 设置为从星期一到星期六的 4AM 运行,所以星期一早上的报告包含了周末的活动,而星期二早上的报告包含了星期一的活动,依此类推。您可以选择在系统不处于繁忙状态的任何时间运行这个报告。monacct 被设置为在每个月第一天的 05:15 AM 运行。
您还可以通过对 runacct 运行频率进行设置,选择记帐时间段。例如,将其设置为每个星期一运行,您可以得到每周的报告。
注意:这的确应该以用户“adm”来运行,但是因为各种问题,这样做将会失败。因为 IBM 文档指出以 root 用户的身份在早上 4:00 运行它,所以让我们继续完成这项任务。请记住检查 adm 的 crontab 文件以确保其中没有计划运行这项任务。
编辑 /usr/sbin/acct/runacct Shell 脚本,取消对“MAILCOM”行的注释,并包括在 runacct 发送邮件时应该接收电子邮件的任何附加登录:MAILCOM = "mail root adm"
然后等到明天。runacct 将在早上 4:00 运行。
如果发现 runacct 或任何 cron 任务没有运行,那么首先检查 /usr/lib/cron/log 以确保它曾尝试运行(请参见清单 14)。
清单 14. 显示成功执行的 /usr/lib/cron/log 条目
root : CMD ( /usr/sbin/acct/dodisk ) : PID ( 16334 ) : Thu Jan 4 02:00:00
2007
adm : CMD ( /usr/sbin/acct/ckpacct > /dev/console 2>&1 ) : PID ( 19702 ) :
Thu Jan 4 02:00:00 2007
Cron Job with pid: 19702 Successful
Cron Job with pid: 16334 Successful
adm : CMD ( /usr/sbin/acct/ckpacct > /dev/console 2>& ) : PID ( 16148 ) :
Thu Jan 4 03:00:00 2007
Cron Job with pid: 16148 Successful
root : CMD ( /usr/sbin/acct/runacct 2>/var/adm/acct/nite/accterr ) : PID (
16218 ) : Thu Jan 4 04:00:00 2007
adm : CMD ( /usr/sbin/acct/ckpacct > /dev/console 2>&1 ) : PID ( 15706 ) :
Thu Jan 4 04:00:00 2007
Cron Job with pid: 15706 Successful
Cron Job with pid: 16218 Successful
它显示了成功的执行。如果 runacct 在运行时出现了任何问题,它将发送邮件。这些问题可能包括 /var/adm 中没有足够的可用空间、重复运行或者当天已经运行(检查您的 crontab 文件)runacct 任务、或者一些其他的内部错误,如文件损坏。该邮件将引导您查看 /var/adm/acct/nite/activeMMDD 文件以了解更多的细节。
runacct 状态和中间文件保存在 /var/adm/acct/nite 目录中。让我们来看一下 /var/adm/acct/nite 中的文件。它可以让您了解 runacct 所进行的处理工作。
accterr 包含来自 runacct cron 任务(请注意 crontab 条目中的重定向操作)的输出。如果 runacct 正确运行,那么它将为空。如果 runacct 遇到问题,可以查看这个文件。
active 文件保存了 runacct 消息。如果 runacct 成功执行,将在清理过程中删除它。
如果 runacct 没有完全执行,那么将留下 activeMMDD(其中 MM 表示月份、DD 表示日期)active 文件。
cms 包含 cumulative 命令进程记帐汇总(从上个月的报告以来)。按照各个命令的内存使用总量进行排序,单位为 KB-分钟 (TOTAL KCOREMIN)。
ctmp 是一个连接时间临时文件。
daycms 包含 daily 命令进程记帐汇总。
daytacct 包含当天的用户进程记帐文件,采用 tacct 的格式。它从 /var/adm/pacct 中提炼得到。您可以使用 /usr/sbin/acct/pracct daytacct 查看其中的内容。
lastdate 是最后运行 runacct 的日期。
lineuse 包含 tty/pty 所使用的连接时间。
log 包含来自连接时间处理 (acctcon1) 的错误输出。
owtmp 包含来自前一天的 wtmp 文件。
reboots 包含系统重启计数和记帐活动计数。
statefile 包含 runacct 当前(或最后)的状态。所以,在出现异常终止或者错误的情况下,可以重新启动 runacct。
有关各种可能的状态的清单(按顺序排列),请参见表 1。
表 1. 各种可能的状态
状态 | 描述 |
SETUP | 这个状态对 pacct 和 wtmp 文件进行切换。 |
WTMPFIX | 这个状态验证和修复 wtmp 文件的完整性。 |
CONNECT1 | 这个状态启动连接时间报告。 |
CONNECT2 | 这个状态将连接时间报告转换为 tacct 记录 (ctacct)。 |
PROCESS | 这个状态将进程记帐文件 (pacct) 处理为 tacct 记录 (ptacct)。 |
MERGE | 这个状态合并进程,并连接 acct 文件。 |
FEES | 这个状态合并了 chargefee 记录。 |
DISK | 这个状态处理来自 dodisk crontab 条目的磁盘记帐。 |
QUEUEACCT | 这个状态处理打印队列记帐 (qacct)。 |
MERGETACCT | 这个状态将当天的 tacct 文件复制到 /var/adm/acct/sum 目录,并将当天的 tacct 文件与汇总 tacct 文件合并到一起。 |
CMS | 这个状态产生命令汇总报告。 |
USEREXIT | 这个状态处理任何自定义的记帐例程 (/var/adm/siteacct)。 |
CLEANUP | 这个状态清除临时文件和锁。 |
COMPLETE | 这个状态表示 runacct 正常结束。 |
当 runacct 执行时,将覆盖 /var/adm/acct/nite 中的文件,所以这些文件始终包含前一天的数据。报告和汇总文件放在 /var/adm/acct/sum 中。
为了保持完整性,让我们看一下 /var/adm/acct/sum 中的文件。这些累积文件包含整个月的数据,而 monacct 将使用这些数据。有关可能的状态的清单,请参见表 2。
表 2. 可能的状态
文件 | 描述 |
cms | 这是 cumulative 命令汇总文件。 |
cmsprev | 这是从前一天开始的命令汇总文件。 |
daycms | 这是从前一天开始的命令汇总文件。 |
loginlog | 这是最近的用户登录文件。 |
rptMMDD | 这是每日的报告,由 runacct 生成,将在下一部分中对其进行描述。 |
tacct | 这是汇总合计记帐文件(月初到当日)。 |
tacctMMDD | 这是每天的总计记帐文件。 |
tacctprev | 这是从前一天开始的汇总合计记帐文件。 |
解释 runacct 报告
runacct 将夜间的报告放到 /var/adm/acct/sum/rprtMMDD 中,其中 MMDD 是运行该报告的月份和日期。它包含记帐数据的汇总,从上次运行 runacct 开始,通常是以前的 24 小时。
第 1 部分:重启
这是 /var/adm/acct/nite/reboots,关于记帐活动和系统重启的变更记录。在这个示例中,系统重启了一次,因此,记帐也重新启动。使用这个报告以证实记帐运行正常(请参见清单 15)。
清单 15. runacct 报告,第 1 部分:重启
# cat /var/adm/acct/sum/rprt0105
Fri Jan 5 04:00:04 PST 2007 DAILY REPORT FOR AIX Page 1
from Thu Jan 4 04:00:01 PST 2007
to Fri Jan 5 04:00:01 PST 2007
1 openacct
1 accting off
1 system boot
1 run-level 2
1 AIX, acctg
1 runacct
1 acctcon1
如果一天中没有重启和正常的记帐活动,那么它应该与清单 16 所示类似。
清单 16. 一天中没有重启的 runacct 报告
1 openacct
1 runacct
1 acctcon1
第 2 部分:总持续时间
这是记帐时间段的总持续时间。这可以指出记帐是否因为某种原因而中断。1440 分钟是 24 小时(请参见清单 17)。
清单 17. 总持续时间
TOTAL DURATION: 1440 MINUTES
第 3 部分:tty/pty 使用时间
tty/ptty 的连接时间报告如清单 18 所示。长时间的 FTP 会话或 tty 的百分之百使用(这表示某个用户没有注销)尤其值得关注。重启显示了控制台 (lft0) 上的中断,而没有登录。FTP 会话将列出进程 ID,而 #OFF 是该会话传输的文件数目(每个文件一次中断)。
清单 18. tty/pty 使用时间
LINE MINUTES PERCENT # SESS # ON # OFF
dtremote 916 64 4 4 7
ftp18908 14 1 1 1 6
lft0 0 0 0 0 5
pts/0 973 68 3 2 4
pts/1 0 0 0 0 1
pts/2 243 17 1 1 1
pts/3 243 17 2 1 1
TOTALS 2374 -- 10 9 25
第 4 部分:用户的每天使用情况报告
该输出包含 80 列,这使得它更容易阅读。按照“黄金时间”和“非黄金时间”将 CPU 使用情况、KCORE(内存使用情况,单位为 KB-分钟)、以及连接时间分开(请参见清单 19)。再加上 Disk Blocks 和 Fees(chargefee 的单位),该数据可用于根据使用情况进行收费。遗憾的是,无法自动地根据一个组、部门、或者成本中心的成员提供单独的汇总报告,而这对于使用情况计费来说是非常合适的。要完成这项任务,需要编写自定义脚本。注意:Clifford Stoll 正是从与此类似的报告出发,开始捕获国际黑客的工作,正如在他经典的书籍 Cuckoo's Egg 中所描述的(有关链接,请参见参考资料部分)。
清单 19. 每日的使用情况报告,第 1 页
Fri Jan 5 04:00:04 PST 2007 DAILY USAGE REPORT FOR AIX Page 1
LOGIN CPU CPU KCORE KCORE CONNECT CONNECT
UID NAME PRIME NPRIME PRIME NPRIME PRIME NPRIME
0 TOTAL 1 6 883 3044 824 1550
0 root 1 5 880 3026 703 871
1 daemon 0 0 0 0 0 0
4 adm 0 0 2 4 0 0
101 monroe 0 1 1 835 121 436
188 imnadm 0 0 0 0 0 0
202 doug 0 0 0 0 0 1
209 bozo 0 0 0 0 0 242
DISK FEES # OF # OF # DISK
BLOCKS PROCS SESS SAMPLES
(TOTAL) 3.020e+06 6 5093 10 0
(root) 489288 0 4831 5 0
(daemon)0 0 2 0 0
(adm) 0 0 225 0 0
(monroe)2.044e+06 4 155 4 1
(imnadm)0 0 1 0 0
(doug) 33 0 3 1 1
(bozo) 0 2 1 1 0
第 5 部分:每日总计命令汇总
在记帐周期中,系统中运行的所有命令的汇总(请参见清单 20)。将 COMMAND NAME 截断为 8 个字符。有趣的是,那些看上去运行频繁的命令通常占用了更大的内存 (SIZE) 和 CPU 使用率(可能是一个脚本,可以对其进行重新编写以获得更高的效率)。另外,应该对这些命令中“HOG FACTOR”(消耗 CPU)、“CHARS TRNSFD”(大量的 I/O)、以及磁盘“BLOCK READS”和写入(清单中没有显示)汇总数据较高的命令进行调查。
清单 20. 每日命令汇总,第 1 页
Fri Jan 5 04:00:03 PST 2007 DAILY COMMAND SUMMARY Page 1
COMMAND NUMBER TOTAL TOTAL TOTAL MEAN MEAN HOG CHARS
NAME CMDS KCOREMIN CPU-MIN REAL-MIN SIZE-K CPU-MIN FACTOR TRNSFD
TOTALS 5093 3926.74 7.70 26649.86 509.93 0.00 0.03 7.207e+07
dtterm 3 2067.87 3.59 943.59 575.32 1.20 0.38 6.186e+06
dfpp 2 1289.88 2.22 2.34 580.95 1.11 94.86 41774.00
dtfile 624 196.54 0.38 1690.62 510.64 0.00 0.02 3.911e+06
dtgreet 4 137.60 0.18 105.22 755.91 0.05 0.17 3.423e+06
dtwm 2 77.31 0.07 850.70 1133.09 0.03 0.01 3.355e+06
dtdbcach 3 28.39 0.03 0.07 1079.27 0.01 37.13 2.685e+06
dtprinti 2 21.18 0.01 0.13 1505.94 0.01 11.00 1.019e+06
rm 63 12.33 0.86 20.32 14.30 0.01 4.24 158121.00
dtaction 1 12.21 0.01 0.04 1267.00 0.01 25.87 949248.00
xdi 1 11.90 0.01 0.02 1385.00 0.01 44.59 3.33e+06
awk 112 8.68 0.03 0.18 292.54 0.00 16.72 1.27e+06
ksh 122 8.23 0.04 1262.75 227.31 0.00 0.00 1.881e+06
bsh 67 4.93 0.03 50.35 141.39 0.00 0.07 1.144e+06
第 6 部分:每月总计命令汇总
这基本上与前面的每日总计命令汇总是相同的,但是它是从上一次运行 monacct(每月的记帐报告)以来的命令活动汇总(请参见清单 21)。
清单 21. 每月总计命令汇总
Fri Jan 5 04:00:03 PST 2007 MONTHLY TOTAL COMMAND SUMMARY Page 1
TOTAL COMMAND SUMMARY
COMMAND NUMBER TOTAL TOTAL TOTAL MEAN MEAN HOG CHARS
NAME CMDS KCOREMIN CPU-MIN REAL-MIN SIZE-K CPU-MIN FACTOR TRNSFD
TOTAL 32405 36937.77 45.47 48754.03 812.33 0.00 0.09 9.713e+09
sor 65 19657.45 4.41 4.74 4458.37 0.07 92.97 3.168e+08
dfpp 11 7035.56 12.17 12.65 578.25 1.11 96.15 165458.00
dtter 14 3927.81 7.45 4095.70 527.54 0.53 0.18 2.07e+07
compr 1853 2523.21 3.49 8.06 723.50 0.00 43.28 8.096e+08
tr 1962 1185.18 5.68 8.62 208.52 0.00 65.97 1.429e+09
...
第 7 部分:最近的登录报告,连接时间报告的一部分
这显示了 /etc/passwd 文件中指定的每个用户的最近登录日期。00-00-00 表示该用户从未登录过(请参见清单 22)。对于那些很长时间都没有登录的非系统帐号,应该进行调查,以确定是否需要锁定或删除该帐号。这样的情况经常发生,一个雇员离开公司,但 IT 部门却没有接到通知,导致不用的文件依然保存在系统中,而这名牢骚满腹的前雇员依然能够访问系统并造成危害。
清单 22. 最近的登录报告
Fri Jan 5 04:00:04 PST 2007 LAST LOGIN Page 1
00-00-00 adm 00-00-00 ipsec 00-00-00 sys
00-00-00 bin 00-00-00 lp 00-00-00 uucp
00-00-00 daemon 00-00-00 lpd 07-01-05 bozo
00-00-00 freeware 00-00-00 nobody 07-01-05 doug
00-00-00 guest 00-00-00 nuucp 07-01-05 monroe
00-00-00 imnadm 00-00-00 snapp 07-01-05 root
00-00-00 invscout
每月的记帐报告
对于观测日常的活动,夜间报告非常有价值,但是没有人愿意每天为使用情况计费。在这种情况下,必须使用每月的(财政)报告。每月的记帐设置为在每个月开始的时候运行。它基于汇总 tacct 文件 (/var/adm/acct/sum/tacct) 创建报告,而 runacct 每天对这个文件进行更新。这个报告位于 /var/adm/acct/fiscal/fscrptMM 中,其中 MM 表示运行 monacct 的月份。它所生成的报告包括各个用户的每月使用情况报告、每月命令汇总、以及最近登录报告。其输出与前面看到的 runacct 报告相同。
除了生成这个报告之外,monacct 还会清理从上个月来的报告。它将 tacct 和 cms 汇总文件的副本保存到 /var/adm/acct/fiscal,并删除或清空 /var/adm/acct/sum 中的每日记帐文件。如果您希望保留这些历史数据,那么需要修改 /usr/sbin/acct/monacct。
自定义报告
在这一部分中,将通过一个示例来研究如何生成报告、或者自定义现有的报告以更改所显示的信息。
示例 1:可能的争论的报告
您可能希望查看一个用户在某个确定的时间所运行的命令,以弄清他们究竟在做什么。ps 起不到任何帮助,因为它仅报告当前正在运行的任务。您可以查看这个用户的 ~/.sh_history 文件,但是它没有提供时间戳,并且该用户可以对其进行修改。此时,acctcom 可以为您提供帮助。您将在手册页面中看到,可以指定用户以及启动和结束时间(请参见清单 23)。
清单 23. 指定用户以及启动和结束时间
$ acctcom -u bozo -S 18:40:00 -E 19:00:00 /var/adm/pacct
ACCOUNTING RECORDS FROM: Mon Jan 8 10:35:37 PST 2007
START AFT: Mon Jan 8 18:40:00 PST 2007
END BEFOR: Mon Jan 8 19:00:00 PST 2007
COMMAND START END REAL CPU MEAN
NAME USER TTYNAME TIME TIME (SECS) (SECS) SIZE(K)
man bozo pts/4 18:40:25 18:40:25 0.02 0.02 0.00
more bozo pts/4 18:40:58 18:41:00 2.48 0.00 0.00
sh bozo pts/4 18:40:58 18:41:00 2.50 0.02 0.00
man bozo pts/4 18:40:58 18:41:00 2.55 0.02 100.00
acctcom bozo pts/4 18:41:11 18:41:11 0.16 0.12 217.00
grep bozo pts/4 18:41:11 18:41:11 0.12 0.00 0.00
more bozo pts/4 18:42:36 18:42:49 13.47 0.00 0.00
sh bozo pts/4 18:42:36 18:42:49 13.50 0.02 0.00
man bozo pts/4 18:42:36 18:42:49 13.55 0.02 170.00
注意:如果 ckpacct 导致了 pacct 文件的切换,那么您可能需要查看多个文件以找到所需的数据。另外,runacct 没有保存每天的 pacct 文件。它从这些文件中将汇总数据合并到 tacct 记录(根据各个用户的使用情况)和 cms(根据各个命令的使用情况)文件,然后删除 pacct 文件。如果您希望保存这些数据,以便能够进行深入研究,而不需要从备份中获取数据,那么您可以编辑 runacct 以保留这些数据。可以进行简单的修复,将这行内容插入到 /usr/sbin/acct/runnacct 中大约 172 行处(请参见清单 24)。
清单 24. 对 runacct 进行修改以保留 pacct 数据
cat pacct?* > ${_nite}/pacct.${_date}
# " give pacct files unique names for easy restart "
确保设置一个保留策略,并监视您的磁盘空间。
示例 2:一个带任务描述的费用记帐包装程序
您可能希望记录费用估价的原因,以用于文档说明的目的。尽管您无法将原因记录到 tacct 文件中,但是您可以创建一个命令脚本,以代替 chargefee 命令的运行,这个脚本可以将原因记录到一个伴随的文件中。这个脚本可以运行 chargefee,所以相关费用将出现在报告中的正常位置。您还可以修改这个报告脚本,以使得它们包括伴随的文件。清单 25 显示了一个名为包装程序的示例,因为它包装了特定的命令 (chargefee) 并且提供了附加的功能。在一个名为“fee”的文件中输入下面的脚本,将其放到系统管理员的路径中,如 /usr/local 或 /usr/sbin/acct。
清单 25. 一个费用记帐包装程序
#!/usr/bin/ksh
#
# fee: wrapper for "chargefee" to record date and reason
# for a fee being assessed to a user. Also collect the
# username of the one doing who did the work and the date.
# stores the full data in /var/adm/acct/nite/longfee, and
# still runs chargefee so that the tacct records will work.
#
_file=/var/adm/acct/nite/longfee
admin='whoami'
today='date +"%m/%d/%Y"'
print "Fee Assessment"
read user?"Enter username to charge: "
read units?"Enter units to charge: "
read desc?"Enter a one line description of the charge: "
if /usr/sbin/acct/chargefee $user $units; then
print "$user $units $today $admin $desc" >> $_file
else
print "Please try again."
fi
向一个文件中输入下面的内容,将其保存到 /usr/sbin/acct(或者 /usr/local),并为其分配正确的所有权和权限(请参见清单 26)。
清单 26. 分配正确的所有权和权限
# chown root:adm fee
# chmod 550 fee
示例 3:一个自定义的记帐报告脚本
runacct 已经提供了运行名为 /var/adm/siteacct 的客户脚本的方法(请参见清单 27)。对于这个示例,您将使用一个脚本。您还可以将类似的代码添加到 runacct 的 FEE 部分中。
清单 27. 执行一个名为 /var/adm/siteacct 的客户脚本
#!/usr/bin/bsh
#
# /var/adm/siteacct: site specific accounting commands
#
_file=/var/adm/acct/nite/longfee
_sumfile=/var/adm/acct/sum/longfee
_dayfile=/var/adm/acct/nite/daylongfee
if test -s $_file ; then
echo "Extended Fee Reporting" > $_dayfile
echo "User Fee Date Admin Description" >> $_dayfile
cat $_file >> $_dayfile
cat $_file >> $_sumfile
/usr/sbin/acct/nulladm $_file
else
/usr/sbin/acct/nulladm $_dayfile
fi
遗憾的是,如果您使用 siteacct 进行打印,这将出现在报告的开头,所以您必须修改 runacct 以便将该内容添加到报告的末尾。编辑 /usr/sbin/acct/runnacct 并将下面的行添加到 CLEANUP 部分,就在 prdaily 命令的后面(请参见清单 28)。
清单 28. 修改 runacct
if test -s nite/daylongfee ; then
cat nite/daylongfee >> sum/rprt${_date};
fi
您还希望将报告和清理代码添加到 monacct 的末尾(请参见清单 29)。
清单 29. 将报告和清理代码添加到 monacct 的末尾
# clean up longfee accounting file
#
if -s ${_sum}/longfee ; then
echo "Extended Fee Reporting" >> ${_fiscal}/fiscrpt${_period}
echo "User Fee Date Admin Description" >> ${_fiscal}/fiscrpt${_period}
cat ${_sum}/longfee >> ${_fiscal}/fiscrpt${_period}
mv -f ${_sum}/longfee ${_fiscal}/longfee${_period}
fi
nulladm ${sum}/longfee
总结
您了解了 AIX 系统中一些可用的不同类型的进程记帐、如何设置它们自动运行,并且通过示例看到了如何提取特定的数据、以及自定义报告。因为大多数报告命令是 Shell 脚本,所以您可以随意修改这些脚本以满足您特定的需求。
更多精彩
赞助商链接