进程统计(Process Accounting)
多数UNIX系统提供一个进程统计的选项。当开启时,每次有进程终止时都会写一条记录。这些记录记载了命令名、CPU使用时间、用户ID、组ID和开始时间等等。
超级用户执行accton命令带一个路径参数可以开启统计记录功能,不带任何参数关闭统计功能。
不同平台的路径通常如下:
- FreeBSD和Mac OS X:/var/account/acct
- Linux:/var/account/pacct
- Solaris:/var/adm/pacct
统计记录(accounting record)是对应于进程的,而不是程序。由内核在fork之后为一个子进程初始化一个新记录,而不是一个新程序被执行。虽然exec不能创建一个新的统计记录,但是命令名会改变,并且AFORK标记被清除。这意味着,如果我们有一个由三个程序组成的链——A exec B, B exec C, 最后C退出,这时只写一条统计记录。命令名最后写的是C,但是CPU时间是三个程序的总和。
统计记录定义在<sys/acct.h>头文件中,看上去如下所示:
typedef u_short comp_t; /* 3-bit base 8 exponent; 13-bit fraction */
struct acct
{
char ac_flag; /* flag (see Figure 8.26) */
char ac_stat; /* termination status (signal & core flag only) */
/* (Solaris only) */
uid_t ac_uid; /* real user ID */
gid_t ac_gid; /* real group ID */
dev_t ac_tty; /* controlling terminal */
time_t ac_btime; /* starting calendar time */
comp_t ac_utime; /* user CPU time (clock ticks) */
comp_t ac_stime; /* system CPU time (clock ticks) */
comp_t ac_etime; /* elapsed time (clock ticks) */
comp_t ac_mem; /* average memory usage */
comp_t ac_io; /* bytes transferred (by read and write) */
/* "blocks" on BSD systems */
comp_t ac_rw; /* blocks read or written */
/* (not present on BSD systems) */
char ac_comm[8]; /* command name: [8] for Solaris, */
/* [10] for Mac OS X, [16] for FreeBSD, and */
/* [17] for Linux */
};
|
ac_stat成员并不是进程真正终止的状态,但是它是终止状态的一部分。如果进程不是正常终止的,这个字节中唯一的信息是core-flag位(通常是高位)和信号数(通常是低七位)。如果进程是正常结束,是不能从统计文件中得到exit状态的。
ac_flag。F标记是给所有子进程设置的(除非子进程执行了exec)。
|