acct("/var/log/pacct");
Quand la comptabilité des processus est active, le noyau écrit dans le fichier indiqué un enregistrement à chaque mort d'un processus. Cet enregistrement contient des informations concernant le processus terminé, décrites dans <sys/acct.h> ainsi :
#define ACCT_COMM 16 typedef u_int16_t comp_t; struct acct { char ac_flag; /* Attribut de comptabilité */ u_int16_t ac_uid; /* UID comptabilisé */ u_int16_t ac_gid; /* GID comptabilisé */ u_int16_t ac_tty; /* Terminal de contrôle */ u_int32_t ac_btime; /* Heure de création du processus */ (secondes depuis 01/01/1970) */ comp_t ac_utime; /* Temps CPU en mode utilisateur */ comp_t ac_stime; /* Temps CPU en mode noyau */ comp_t ac_etime; /* Temps écoulé */ comp_t ac_mem; /* Moyenne mémoire utilisée (ko) */ comp_t ac_io; /* Caractères transmis (inutilisé) */ comp_t ac_rw; /* Blocs lus ou écrits (inutilisé) */ comp_t ac_minflt; /* Nb fautes de pages mineures */ comp_t ac_majflt; /* Nb fautes de pages majeures */ comp_t ac_swaps; /* Nb de swaps (inutilisé) */ u_int32_t ac_exitcode; /* Code de retour - voir wait(2) */ char ac_comm[ACCT_COMM+1]; /* Nom de la commande (nom de base de la dernière commande exécutée terminé par zéro)*/ char ac_pad[X]; /* Remplissage*/ }; enum { /* Bits qui peuvent se trouver dans ac_flag */ AFORK = 0x01, /* A exécuté fork mais pas exec */ ASU = 0x02, /* A utilisé les privilèges superutilisateur */ ACORE = 0x08, /* A créé un fichier core */ AXSIG = 0x10 /* Tué par un signal */ };
Le type de donnée comp_t est une valeur réelle constituée d'un exposant en base 8 sur 3 bits et d'une mantisse sur 13 bits. Une valeur c, de ce type peut être convertie en entier (long) ainsi :
v = (c & 0x1fff) << (((c >> 13) & 0x7) * 3);
Les champs ac_utime, ac_stime, et ac_etime mesurent les temps en « tops d'horloge ». Divisez ces valeurs par sysconf(_SC_CLK_TCK) pour obtenir des secondes.
struct acct_v3 { char ac_flag; /* Attribut de comptabilité */ char ac_version; /* Vaut toujours ACCT_VERSION (3) */ u_int16_t ac_tty; /* Terminal de contrôle */ u_int32_t ac_exitcode; /* Code de retour - voir wait(2) */ u_int32_t ac_uid; /* UID réel */ u_int32_t ac_gid; /* GID réel */ u_int32_t ac_pid; /* PID */ u_int32_t ac_ppid; /* PPID (PID du parent) */ u_int32_t ac_btime; /* Heure de création du processus */ (secondes depuis 01/01/1970) */ comp_t ac_etime; /* Temps écoulé */ comp_t ac_utime; /* Temps CPU en mode utilisateur */ comp_t ac_stime; /* Temps CPU en mode noyau */ comp_t ac_mem; /* Moyenne mémoire utilisée (ko) */ comp_t ac_io; /* Caractères transmis (inutilisé) */ comp_t ac_rw; /* Blocs lus ou écrits (inutilisé) */ comp_t ac_minflt; /* Nb fautes de pages mineures */ comp_t ac_majflt; /* Nb fautes de pages majeures */ comp_t ac_swaps; /* Nb de swaps (inutilisé) */ char ac_comm[ACCT_COMM+1]; /* Nom de la commande */ char ac_pad[X]; /* Remplissage */ };
Dans les noyaux jusqu'au 2.6.9 (inclus), un enregistrement séparé était écrit pour chaque thread utilisant la bibliothèque NPTL. Depuis Linux 2.6.10, un enregistrement unique est écrit pour l'ensemble du processus à la fin de son dernier thread.
Le fichier proc/sys/kernel/acct décrit dans proc(5), configure le comportement de la comptabilité des processus lorsque l'espace disque commence à manquer.
Ce document est une traduction réalisée par Christophe Blaess <http://www.blaess.fr/christophe/> le 2 juillet 2008.
L'équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : « LANG=C man 5 acct ». N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.
Dernière mise à jour : 2 juillet 2008