Oracle Solaris OS 中的系统记帐软件是一组程序,用于收集和记录有关用户连接时间、进程占用的 CPU 时间和磁盘使用情况的数据。收集到此数据后,即可生成报告并针对系统使用情况收取费用。
可以使用每日或每月系统记帐。或者,也可以按用户跟踪磁盘使用情况。
监视系统使用情况
查找并更正性能问题
维护系统安全
在设置系统记帐程序后,这些程序大部分时间会自行运行。
设置自动记帐时,先要将记帐启动脚本放入根的 crontab 文件中。然后,cron 命令即可自动启动该记帐启动脚本。
以下概述介绍了系统记帐过程。
在系统启动和关闭期间,会在记帐文件中收集有关系统使用(如用户登录、运行进程和数据存储)的原始数据。
/usr/lib/acct/runacct 脚本会定期(通常一天一次)处理各种记帐文件并生成累积概要文件和每日记帐报告。然后,/usr/lib/acct/prdaily 脚本将打印每日报告。
有关 runacct 脚本的更多信息,请参见runacct 脚本。
可以通过执行 monacct 脚本每月处理并打印一次累积 runacct 摘要文件。monacct 脚本生成的摘要报告提供了一种按月或按其他财务周期对用户计费的有效方法。
系统记帐软件提供了可将数据组织为摘要文件和报告的 C 语言程序和 Shell 脚本。这些程序驻留在 /usr/lib/acct 目录中。记帐报告驻留在 /var/adm/acct 目录中。
每日记帐有助于执行四种类型的审计:
连接记帐
进程记帐
磁盘记帐
费用计算
用户已登录的时间
tty 线的使用情况
系统重新引导的次数
已关闭和打开记帐软件的次数
要提供有关连接会话的记帐信息,系统需要存储以下数据:
时间调整的记录
引导时间
关闭和打开记帐软件的次数
运行级的更改
用户进程(login 进程和 init 进程)的创建
进程的终止
这些记录是从系统程序(如 date、init、login、ttymon 和 acctwtmp)的输出中生成的。这些记录存储在 /var/adm/wtmpx 文件中。
wtmpx 文件中的项可以包含以下信息:
登录名称
设备名称
进程 ID
项类型
指明项创建时间的时间标记
使用进程的用户的用户 ID 和组 ID
进程的启动时间和已用时间
进程的 CPU 时间(用户时间和系统时间)
进程使用的内存量
进程运行的命令
控制进程的 tty
每次进程终止时,exit 程序便会收集此信息并将其写入 /var/adm/pacct 文件。
通过磁盘记帐可以收集有关每个用户在磁盘中的文件的以下数据并设置数据格式:
用户的用户名和用户 ID
用户的文件占用的块数
/usr/lib/acct/dodisk shell 脚本以一定的时间间隔收集上述数据,该时间间隔是由您向 /var/spool/cron/crontabs/root 文件中添加的项确定的。反过来,dodisk 脚本会调用 acctdisk 和 acctdusg 命令。这些命令按登录名称收集磁盘使用情况的信息。
通过运行 dodisk 脚本收集的信息存储在 /var/adm/acct/nite/disktacct 文件中。下次运行 dodisk 脚本时将覆写此信息。因此,请避免在同一天中两次运行 dodisk 脚本。
对于随机写入的文件,acctdusg 命令计算的磁盘占用量可能比实际多,这会在文件中形成空洞。出现这种问题是由于 acctdusg 命令在确定文件大小时未读取文件的间接块。更确切地说,acctdusg 文件是通过检查文件 inode 中的当前文件大小值来确定文件大小的。
chargefee 实用程序在 /var/adm/fee 文件中存储为用户提供的特殊服务的费用。例如,特殊服务可以是文件恢复。文件中的每项都由用户登录名、用户 ID 和费用组成。runacct 每天都会检查此文件,并将新项合并到记帐记录中。有关运行 chargefee 脚本以对用户计费的说明,请参见如何对用户计费。
将系统切换到多用户模式时,执行 /usr/lib/acct/startup 程序。startup 程序会执行多个调用每日记帐的其他程序。
acctwtmp 程序向 /var/adm/wtmpx 文件中添加一条“引导”记录。在此记录中,系统名显示为 wtmpx 记录中的用户名。下表汇总了原始记帐数据的收集方式及存储位置。
/var/adm 中的文件 |
存储的信息 |
写入程序 |
格式 |
---|---|---|---|
连接会话 |
login、init |
二进制 |
|
|
date |
二进制 |
|
|
acctwtmp |
二进制 |
|
|
shutacct |
二进制 |
|
进程 |
Kernel(当进程结束时) |
二进制 |
|
|
|
二进制 |
|
特殊费用 |
chargefee |
ASCII |
|
使用的磁盘空间 |
dodisk |
二进制 |
使用 -on 选项调用的 turnacct 脚本开始进程记帐。具体来讲,就是 turnacct 脚本使用 /var/adm/pacct 参数执行 accton 程序。
删除 Shell 脚本会“清除”由 runacct 脚本留在 sum 目录中的已保存的 pacct 和 wtmpx 文件。
login 和 init 程序通过向 /var/adm/wtmpx 文件中写入记录来记录连接会话。日期更改(使用带参数的日期)也会写入 /var/adm/wtmpx 文件中。使用 acctwtmp 命令进行重新引导和关闭也会记录到 /var/adm/wtmpx 文件中。
进程结束时,内核会使用 acct.h 格式在 /var/adm/pacct 文件中为每个进程写入一条记录。
cron 命令每小时执行一次 ckpacct 脚本,以检查 /var/adm/pacct 文件的大小。如果文件大小超出了 500 块(缺省值),则会执行 turnacct switch 命令。(程序将 pacct 文件移至 pacctn 文件并创建一个新文件。)如果由于处理这些记录时出现故障而尝试重新启动 runacct 脚本,则有多个小型 pacct 文件的优点是显而易见的。
cron 命令每晚都会执行 runacct 脚本。runacct 脚本会对记帐文件进行处理,从而按用户名生成命令概要和使用情况概要。将处理以下记帐文件: /var/adm/pacctn、/var/adm/wtmpx、/var/adm/fee 和 /var/adm/acct/nite/disktacct。
runacct 脚本每天执行一次 /usr/lib/acct/prdaily 脚本,以便将每日记帐信息写入 /var/adm/acct/sum/rprtMMDD 文件中。
monacct 脚本应每月执行一次(或以您确定的时间间隔执行,例如在每个财务周期结束时执行)。monacct 脚本会基于 sum 目录中存储的数据创建一个报告,该目录每天通过 runacct 脚本更新一次。创建报告后,monacct 脚本将“清除”sum 目录,以便为新的 runacct 数据准备目录文件。
如果使用 shutdown 命令关闭系统,则会自动执行 shutacct 脚本。shutacct 脚本会向 /var/adm/wtmpx 文件中写入一条原因记录并关闭进程记帐。