ACCT(5) Руководство программиста Linux ACCT(5)

ИМЯ

acct - файл учёта процессов

ОБЗОР

#include <sys/acct.h>

ОПИСАНИЕ

Если ядро собрано с включённым параметром учёта процессов (CONFIG_BSD_PROCESS_ACCT), то системный вызов acct(2) запустит учёт процесса:

acct("/var/log/pacct");

При включённом учёте процессов, ядро делает запись в файл учёта по каждому процессу системы по его завершении. Эта запись содержит информацию о завершённом процессе и определена в <sys/acct.h> следующим образом:

#define ACCT_COMM 16
typedef u_int16_t comp_t;
struct acct {

    char ac_flag;           /* флаги учёта */

    u_int16_t ac_uid;       /* ID пользователя */

    u_int16_t ac_gid;       /* ID группы */

    u_int16_t ac_tty;       /* управляющий терминал */

    u_int32_t ac_btime;     /* время создания процесса

                               (в секундах с начала эпохи) */

    comp_t    ac_utime;     /* время работы ЦП в пользовательском режиме */

    comp_t    ac_stime;     /* время работы ЦП в системном режиме */

    comp_t    ac_etime;     /* прошедшее время */

    comp_t    ac_mem;       /* среднее количество использованной памяти (КБ) */

    comp_t    ac_io;        /* передано символов (не используется) */

    comp_t    ac_rw;        /* прочитано или записано блоков (не используется) */

    comp_t    ac_minflt;    /* промахи для вспомогательных страниц */

    comp_t    ac_majflt;    /* промахи для главных страниц */

    comp_t    ac_swaps;     /* количество подкачек (не используется) */

    u_int32_t ac_exitcode;  /* код завершения процесса

                               (см. wait(2)) */

    char      ac_comm[ACCT_COMM+1];

                            /* имя команды (basename от последней

                               исполнявшейся команды; завершается null) */

    char      ac_pad[X];    /* байты заполнения */
};
enum {                      /* биты для поля ac_flag */

    AFORK = 0x01,           /* был выполнен fork, но не exec */

    ASU   = 0x02,           /* использовались права суперпользователя */

    ACORE = 0x08,           /* создан файл core */

    AXSIG = 0x10            /* завершён по сигналу */
};

Тип данных comp_t — это число с плавающей точкой, состоящее из 3-битной экспоненты по основанию 8 и 13-битной мантиссы. Переменная c этого типа может быть преобразована к целому (long) так:


    v = (c & 0x1fff) << (((c >> 13) & 0x7) * 3);

Поля ac_utime, ac_stime и ac_etime хранят время в "тактах часов"; для преобразования в секунды нужно поделить значение на sysconf(_SC_CLK_TCK).

Формат файла учёта версии 3

Начиная с ядра версии 2.6.8, можно создавать файл учёта альтернативной версии, если задать параметр CONFIG_BSD_PROCESS_ACCT_V3 при сборке ядра. Если этот параметр установлен, то записи, сохранённые в файле учёта, будут содержать дополнительные поля, а ширина полей c_uid и ac_gid будет расширена с 16 до 32 бит (для соответствия с увеличенным размером UID и GID в Linux 2.4 и новее). Записи определены следующим образом:

struct acct_v3 {

    char      ac_flag;      /* флаги */

    char      ac_version;   /* всегда равно ACCT_VERSION (3) */

    u_int16_t ac_tty;       /* управляющий терминал */

    u_int32_t ac_exitcode;  /* код завершения процесса

    u_int32_t ac_uid;       /* реальный ID пользователя */

    u_int32_t ac_gid;       /* реальный ID группы */

    u_int32_t ac_pid;       /* ID процесса */

    u_int32_t ac_ppid;      /* ID родительского процесса */

    u_int32_t ac_btime;     /* время создания процесса

    float     ac_etime;     /* прошедшее время */

    comp_t    ac_utime;     /* время работы ЦП в пользовательском режиме */

    comp_t    ac_stime;     /* время работы ЦП в системном режиме */

    comp_t    ac_mem;       /* среднее количество использованной памяти (КБ) */

    comp_t    ac_io;        /* передано символов (не используется) */

    comp_t    ac_rw;        /* прочитано или записано блоков

                            (не используется) */

    comp_t    ac_minflt;    /* промахи для вспомогательных страниц */

    comp_t    ac_majflt;    /* промахи для главных страниц */

    comp_t    ac_swaps;     /* количество подкачек (не используется) */

    char      ac_comm[ACCT_COMM]; /* имя команды */
};

ВЕРСИИ

Структура acct_v3 определена в glibc начиная с версии 2.6.

СООТВЕТСТВИЕ СТАНДАРТАМ

Учёт процессов возник в BSD. Хотя он есть в большинстве систем, он не стандартизован, и параметры разнятся между системами.

ЗАМЕЧАНИЯ

Записи в файле учёта упорядочены по времени завершения процессов.

В ядрах до версии 2.6.9 включительно, с помощью библиотеки нитей NPTL для каждой нити сохранялась своя запись учёта; начиная с Linux 2.6.10 отдельная запись сохраняется для всего процесса при завершении работы его последней нити.

В файле /proc/sys/kernel/acct, описанном в proc(5), определены настройки, которые управляют поведением учёта процессов при нехватке места на диске.

СМОТРИТЕ ТАКЖЕ

lastcomm(1), acct(2), accton(8), sa(8)

2017-09-15 Linux