Guía de administración de sistemas: administración de recursos y contenedores de Oracle Solaris y zonas de Oracle Solaris

Capítulo 5 Administración de contabilidad ampliada (tareas)

Este capítulo describe cómo administrar el subsistema de contabilidad ampliada.

Para ver una descripción general del subsistema de contabilidad ampliada, consulte el Capítulo 4Contabilidad ampliada (descripción general).

Administración de la función de contabilidad ampliada (mapa de tareas)

Tarea 

Descripción 

Para obtener instrucciones 

Activar la función de contabilidad ampliada. 

Utiliza la contabilidad ampliada para supervisar el consumo de recursos de cada proyecto que se ejecuta en el sistema. Puede utilizar el subsistema de contabilidad ampliada para capturar los datos históricos para los procesos, tareas y flujos.

Cómo activar la contabilidad ampliada para procesos, tareas y flujos, Como activar la contabilidad ampliada con una secuencia de inicio

Mostrar el estado de la contabilidad ampliada. 

Determina el estado de la función de contabilidad ampliada. 

Cómo mostrar el estado de la contabilidad ampliada

Ver los recursos de cuentas disponibles. 

Visualiza los recursos de cuentas disponibles en el sistema. 

Cómo ver los recursos de cuentas disponibles

Desactivar la función de cuentas de procesos, tareas y flujos. 

Desactiva la función de contabilidad ampliada. 

Cómo desactivar las cuentas de procesos, tareas y flujos

Utilizar la interfaz de Perl para la función de contabilidad ampliada. 

Utiliza la interfaz de Perl para desarrollar secuencias de informes y extracción personalizadas. 

Uso de la interfaz de Perl para libexacct

Uso de funciones de contabilidad ampliada

Los usuarios pueden administrar la contabilidad ampliada (iniciar contabilidad, detener contabilidad y cambiar parámetros de configuración de contabilidad) si tienen el perfil con los derechos pertinentes para el tipo de contabilidad ampliada que se debe administrar:

ProcedureCómo activar la contabilidad ampliada para procesos, tareas y flujos

Para activar la función de contabilidad ampliada para procesos, tareas y flujos, utilice el comando acctadm. El parámetro final opcional para acctadm indica si el comando se aplica al proceso, a la tarea del sistema o a los componentes de cuentas de flujo de la función de contabilidad ampliada.

  1. Conviértase en superusuario o asuma una función similar.

    Las funciones incluyen autorizaciones y comandos con privilegios. Para obtener más información sobre las funciones, consulte Using the Solaris Management Tools With RBAC (Task Map) de System Administration Guide: Basic Administration.

  2. Active la contabilidad ampliada para los procesos.


    # acctadm -e extended -f /var/adm/exacct/proc process
    
  3. Active la contabilidad ampliada para las tareas.


    # acctadm -e extended,mstate -f /var/adm/exacct/task task
    
  4. Active la contabilidad ampliada para los flujos.


    # acctadm -e extended -f /var/adm/exacct/flow flow
    
Véase también

Consulte acctadm(1M) para obtener más información.

Como activar la contabilidad ampliada con una secuencia de inicio

Active la contabilidad ampliada de forma continuada vinculando la secuencia /etc/init.d/acctadm en /etc/rc2.d.


# ln -s /etc/init.d/acctadm /etc/rc2.d/Snacctadm
# ln -s /etc/init.d/acctadm /etc/rc2.d/Knacctadm

La variable n se sustituye con un número.

Debe activar manualmente la contabilidad ampliada al menos una vez para establecer la configuración.

Consulte Configuración de contabilidad ampliada para obtener información sobre la configuración de cuentas.

Cómo mostrar el estado de la contabilidad ampliada

Escriba acctadm sin argumentos para mostrar el estado actual de la función de contabilidad ampliada.


# acctadm
                 Task accounting: active
            Task accounting file: /var/adm/exacct/task
          Tracked task resources: extended
        Untracked task resources: none
              Process accounting: active
         Process accounting file: /var/adm/exacct/proc
       Tracked process resources: extended
     Untracked process resources: host
                 Flow accounting: active
            Flow accounting file: /var/adm/exacct/flow
          Tracked flow resources: extended
        Untracked flow resources: none

En el ejemplo anterior, la cuenta de tareas del sistema está activa en el modo extendido y el modo mstate. Las cuentas de proceso y flujo están activas en modo extendido.


Nota –

En el contexto de la contabilidad ampliada, el microestado (mstate) hace referencia a los datos ampliados, asociados con las transiciones de procesos de microestado, disponibles en el archivo de uso del proceso (consulte proc(4)). Estos datos proporcionan más cantidad de detalles sobre las actividades del proceso que los registros básicos o extendidos.


Cómo ver los recursos de cuentas disponibles

Los recursos disponibles pueden variar según el sistema y la plataforma. Utilice el comando acctadm con la opción -r para ver los grupos de recursos de contabilidad disponibles en el sistema.


# acctadm -r
process:
extended pid,uid,gid,cpu,time,command,tty,projid,taskid,ancpid,wait-status,zone,flag,
memory,mstatedisplays as one line
basic    pid,uid,gid,cpu,time,command,tty,flag
task:
extended taskid,projid,cpu,time,host,mstate,anctaskid,zone
basic    taskid,projid,cpu,time
flow:
extended 
saddr,daddr,sport,dport,proto,dsfield,nbytes,npkts,action,ctime,lseen,projid,uid
basic    saddr,daddr,sport,dport,proto,nbytes,npkts,action

ProcedureCómo desactivar las cuentas de procesos, tareas y flujos

Para desactivar las cuentas de procesos, tareas y flujos, desactive cada una de ellas de forma individual utilizando el comando acctadm con la opción -x.

  1. Conviértase en superusuario o asuma una función similar.

    Las funciones incluyen autorizaciones y comandos con privilegios. Para obtener más información sobre las funciones, consulte Using the Solaris Management Tools With RBAC (Task Map) de System Administration Guide: Basic Administration.

  2. Desactive las cuentas de procesos.


    # acctadm -x process 
    
  3. Desactive las cuentas de tareas.


    # acctadm -x task
    
  4. Desactive las cuentas de flujos.


    # acctadm -x flow
    
  5. Compruebe que se hayan desactivado las cuentas de procesos, tareas y flujos.


    	# acctadm
                Task accounting: inactive
           Task accounting file: none
         Tracked task resources: extended
       Untracked task resources: none
             Process accounting: inactive
        Process accounting file: none
      Tracked process resources: extended
    Untracked process resources: host
                Flow accounting: inactive
           Flow accounting file: none
         Tracked flow resources: extended
       Untracked flow resources: none

Uso de la interfaz de Perl para libexacct

Cómo imprimir de forma recurrente el contenido de un objeto exacct

Utilice el código siguiente para imprimir de forma recurrente el contenido de un objeto exacct. Tenga en cuenta que esta función la proporciona la biblioteca como función de Sun::Solaris::Exacct::Object::dump(). Esta función también está disponible mediante la función de conveniencia ea_dump_object().


sub dump_object
     {
             my ($obj, $indent) = @_;
             my $istr = '  ' x $indent;

             #
             # Retrieve the catalog tag.  Because we are 
             # doing this in an array context, the
             # catalog tag will be returned as a (type, catalog, id) 
             # triplet, where each member of the triplet will behave as 
             # an integer or a string, depending on context.
             # If instead this next line provided a scalar context, e.g.
             #    my $cat  = $obj->catalog()->value();
             # then $cat would be set to the integer value of the 
             # catalog tag.
             #
             my @cat = $obj->catalog()->value();

             #
             # If the object is a plain item
             #
             if ($obj->type() == &EO_ITEM) {
                     #
                     # Note: The '%s' formats provide s string context, so
                     # the components of the catalog tag will be displayed
                     # as the symbolic values. If we changed the '%s'
                     # formats to '%d', the numeric value of the components
                     # would be displayed.
                     #
                     printf("%sITEM\n%s  Catalog = %s|%s|%s\n", 
                        $istr, $istr, @cat);
                     $indent++;

                     #
                     # Retrieve the value of the item.  If the item contains
                     # in turn a nested exacct object (i.e., an item or
                     # group),then the value method will return a reference
                     # to the appropriate sort of perl object
                     # (Exacct::Object::Item or Exacct::Object::Group).
                     # We could of course figure out that the item contained
                     # a nested item orgroup by examining the catalog tag in
                     # @cat and looking for a type of EXT_EXACCT_OBJECT or
                     # EXT_GROUP.
                     #
                     my $val = $obj->value();
                     if (ref($val)) {
                             # If it is a nested object, recurse to dump it.
                             dump_object($val, $indent);
                     } else {
                             # Otherwise it is just a 'plain' value, so
                             # display it.
                             printf("%s  Value = %s\n", $istr, $val);
                     }

             #
             # Otherwise we know we are dealing with a group.  Groups
             # represent contents as a perl list or array (depending on
             # context), so we can process the contents of the group
             # with a 'foreach' loop, which provides a list context.
             # In a list context the value method returns the content
             # of the group as a perl list, which is the quickest
             # mechanism, but doesn't allow the group to be modified.
             # If we wanted to modify the contents of the group we could
             # do so like this:
             #    my $grp = $obj->value();   # Returns an array reference
             #    $grp->[0] = $newitem;
             # but accessing the group elements this way is much slower.
             #
             } else {
                     printf("%sGROUP\n%s  Catalog = %s|%s|%s\n",
                         $istr, $istr, @cat);
                     $indent++;
                     # 'foreach' provides a list context.
                     foreach my $val ($obj->value()) {
                             dump_object($val, $indent);
                     }
                     printf("%sENDGROUP\n", $istr);
             }
     }

Cómo crear un registro de grupo y guardarlo en un archivo

Utilice esta secuencia para crear un registro de grupos y guardarlo en un archivo denominado /tmp/exacct.


#!/usr/bin/perl

use strict;
use warnings;
use Sun::Solaris::Exacct qw(:EXACCT_ALL);
# Prototype list of catalog tags and values.
     my @items = (
             [ &EXT_STRING | &EXC_DEFAULT | &EXD_CREATOR      => "me"       ],
             [ &EXT_UINT32 | &EXC_DEFAULT | &EXD_PROC_PID     => $$         ],
             [ &EXT_UINT32 | &EXC_DEFAULT | &EXD_PROC_UID     => $<         ],
             [ &EXT_UINT32 | &EXC_DEFAULT | &EXD_PROC_GID     => $(         ],
             [ &EXT_STRING | &EXC_DEFAULT | &EXD_PROC_COMMAND => "/bin/rec" ],
     );

     # Create a new group catalog object.
     my $cat = ea_new_catalog(&EXT_GROUP | &EXC_DEFAULT | &EXD_NONE)

     # Create a new Group object and retrieve its data array.
     my $group = ea_new_group($cat);
     my $ary = $group->value();

     # Push the new Items onto the Group array.
     foreach my $v (@items) {
             push(@$ary, ea_new_item(ea_new_catalog($v->[0]), $v->[1]));
     }

     # Open the exacct file, write the record & close.
     my $f = ea_new_file('/tmp/exacct', &O_RDWR | &O_CREAT | &O_TRUNC)
        || die("create /tmp/exacct failed: ", ea_error_str(), "\n");
     $f->write($group);
     $f = undef;

Cómo imprimir el contenido de un archivo exacct

Utilice la siguiente secuencia Perl para imprimir el contenido de un archivo exacct.


#!/usr/bin/perl

     use strict;
     use warnings;
     use Sun::Solaris::Exacct qw(:EXACCT_ALL);

     die("Usage is dumpexacct <exacct file>\n") unless (@ARGV == 1);

     # Open the exact file and display the header information.
     my $ef = ea_new_file($ARGV[0], &O_RDONLY) || die(error_str());
     printf("Creator:  %s\n", $ef->creator());
     printf("Hostname: %s\n\n", $ef->hostname());

     # Dump the file contents
     while (my $obj = $ef->get()) {
             ea_dump_object($obj);
     }

     # Report any errors
     if (ea_error() != EXR_OK && ea_error() != EXR_EOF)  {
             printf("\nERROR: %s\n", ea_error_str());
             exit(1);
     }
     exit(0);

Ejemplo de salida de Sun::Solaris::Exacct::Object->dump()

A continuación se incluye un ejemplo de salida al ejecutar Sun::Solaris::Exacct::Object->dump() en el archivo creado en Cómo crear un registro de grupo y guardarlo en un archivo.


Creator:  root
Hostname: localhost
GROUP
       Catalog = EXT_GROUP|EXC_DEFAULT|EXD_NONE
       ITEM
         Catalog = EXT_STRING|EXC_DEFAULT|EXD_CREATOR
         Value = me
       ITEM
         Catalog = EXT_UINT32|EXC_DEFAULT|EXD_PROC_PID
         Value = 845523
       ITEM
         Catalog = EXT_UINT32|EXC_DEFAULT|EXD_PROC_UID
         Value = 37845
       ITEM
         Catalog = EXT_UINT32|EXC_DEFAULT|EXD_PROC_GID
         Value = 10
       ITEM
         Catalog = EXT_STRING|EXC_DEFAULT|EXD_PROC_COMMAND
         Value = /bin/rec
ENDGROUP