procesos

From Genunix

Jump to: navigation, search

Categoría: Procesos

Contents

Procesos y señales

Introducción

En este capitulo veremos como gestiona Solaris los procesos que no difiere mucho del resto de unix existentes en el mercado. Igualmente si provienes de Linux te resultará fácil adaptarte a las singularidades de Solaris. Cada programa que se ejecuta en el sistema se corresponde con uno o varios procesos. Solaris como cualquier sistema multiusuario permite a cualquier usuario ejecutar más de un proceso simultáneamente, los procesos de un mismo usuario pueden comunicarse entre si pero no con los procesos de otro usuario. El usuario root es el único que puede comunicarse con todos los procesos en ejecución. Cada proceso está identificado por un PID único y a su vez tienen asociado un identificador de usuario (UID) y su grupo (GID).


Ver los procesos en ejecución

Uno de los comandos mas habituales para un administrador de sistemas es sin duda el comando ps. El comando ps nos permite ver los procesos en ejecución en el sistema y obtener información de cada uno de ellos.

Veamos un ejemplo de la ejecución del comando ps –ef:

 UID   PID  PPID   C    STIME TTY         TIME CMD
    root     0     0   0 23:51:57 ?          30:42 sched
    root     1     0   0 23:51:58 ?           0:00 /sbin/init
    root     2     0   0 23:51:58 ?           0:00 pageout
    root     3     0   0 23:51:58 ?           0:01 fsflush
  daemon   223     1   0 23:52:18 ?           0:00 /usr/sbin/rpcbind
    root     7     1   0 23:51:58 ?           0:10 /lib/svc/bin/svc.startd
    root    45     1   0 23:52:02 ?           0:00 /sbin/dhcpagent
    root     9     1   0 23:51:58 ?           0:19 /lib/svc/bin/svc.configd
    root   230     1   0 23:52:18 ?           0:00 /usr/lib/dmi/dmispd
    root   419     1   0 23:52:29 ?           0:00 /usr/lib/autofs/automountd
    root   139     1   0 23:52:14 ?           0:00 /usr/lib/sysevent/syseventd
    root    71     1   0 23:52:09 ?           0:00 /usr/sfw/sbin/snmpd

Iinformación que nos aporta la salida del comando:

  • UID: usuario propietario del proceso.
  • PID: número de identificación del proceso.
  • PPID: número que identifica el proceso padre.
  • STIME: fecha en la que se arrancó el proceso.
  • TTY: terminal del proceso.
  • CMD: programa en ejecución.

La siguiente tabla muestra los parámetros más útiles para utilizar con el comando ps:

Parámetro y Función

  • -a Muestra los procesos mas solicitados.
  • -e Muestra todos los procesos en ejecución.
  • -f Muestra información ampliada de los procesos.
  • -p Muestra el ID de la CPU asociada al proceso.
  • -u Muestra todos los procesos de un usuario específico.
  • -c Muestra los datos con formato planificación y prioridad de procesos.
  • -G Muestra los procesos ejecutados por un grupo.

Los siguientes ejemplos muestran el uso del comando ps:

Para ver los procesos pertenecientes al usuario aulaunix:

bash-3.00$ ps -u aulaunix
   PID TTY         TIME CMD
   712 pts/1       0:00 bash
   733 pts/1       0:00 ps
   682 ?           0:01 sshd
   684 pts/1       0:00 sh

Muestra los datos en formato planificación:

bash-3.00$ ps -c
   PID  CLS PRI TTY         TIME CMD
   712   TS  49 pts/1       0:00 bash
   734   TS  49 pts/1       0:00 ps
   684   TS  59 pts/1       0:00 sh

La opción ejecutada en el ejemplo con –c muestra información interesante como los valores CLS que indica el tipo de prioridad y PRI que muestra la prioridad del proceso.

Muestra los procesos en ejecución del grupo aulaunix:

bash-3.00$ grep -i aulaunix /etc/group

aulaunix::100:
bash-3.00$  ps -G 100
   PID TTY         TIME CMD
   712 pts/1       0:00 bash
   742 pts/1       0:00 ps
   682 ?           0:01 sshd
   684 pts/1       0:00 sh

Observa que el grupo es indicado con su GID que hemos obtenido mirando su valor en el fichero /etc/group.

El comando prstat

El comando prstat muestra información de los procesos en ejecución ordenados por el uso de CPU. Ejemplo de la ejecución del comando prstat:

bash-3.00$ prstat
PID USERNAME  SIZE   RSS STATE  PRI NICE      TIME  CPU PROCESS/NLWP       
   668 noaccess  159M   80M sleep   59    0   0:00:29 0,5% java/24
   744 aulaunix 4492K 2644K cpu0    39    0   0:00:00 0,4% prstat/1
   682 aulaunix 7952K 2100K sleep   59    0   0:00:00 0,0% sshd/1
   712 aulaunix 2484K 1612K sleep   49    0   0:00:00 0,0% bash/1
   131 root     3824K 2360K sleep   59    0   0:00:00 0,0% nscd/24
   535 root     4444K 1724K sleep   59    0   0:00:00 0,0% dtlogin/1
   670 root     7096K 2076K sleep   59    0   0:00:00 0,0% sendmail/1
     1 root     2024K 1120K sleep   59    0   0:00:00 0,0% init/1
   269 root     4416K 3052K sleep   59    0   0:00:03 0,0% inetd/4
   278 root     2820K 1140K sleep   59    0   0:00:00 0,0% sh/1
   214 root     2272K  900K sleep   59    0   0:00:00 0,0% cron/1
   143 daemon   3932K 1968K sleep   59    0   0:00:00 0,0% kcfd/3
   111 root     2156K 1296K sleep   59    0   0:00:00 0,0% snmpdx/1
   258 root     1700K  896K sleep   59    0   0:00:00 0,0% sac/1
    71 root     6556K 4572K sleep   59    0   0:00:00 0,0% snmpd/1
Total: 43 processes, 180 lwps, load averages: 0,02, 0,03, 0,31

En la siguiente lista puedes ver la información aportada por la ejecución del comando:

  • PID: identificador del proceso.
  • USERNAME: propietario del proceso.
  • SIZE: memoria virtual utilizada por el proceso.
  • STATE: estado del proceso, los estados del proceso pueden ser cpu, sleep, run, zombie y stop.
  • PRI: prioridad del proceso.
  • NICE: valor para el calculo de la prioridad del proceso.
  • TIME: tiempo total que lleva el procesos ejecutandose.
  • CPU: porcentaje de CPU utilizado por el proceso.
  • PROCCESS/NLWP: nombre del proceso/número de hilos del mismo.

El comando prstat proporciona diversos parámetros para obtener mas información, los parámetros mas útiles son:

  • -t: muestra información agrupada por usuario.
  • -p [PID]: muestra solo la información para un solo proceso identificado por su PID.
  • -n: número máximo de procesos mostrados.

Señales

Los procesos en ejecución puede ser necesario detenerlos por que su funcionamiento no es el esperado, no responden o cualquier otra causa. El comando kill nos permite enviar una señal al proceso para que se detenga.

Las señales que podemos enviar son:


  • SIGHUP 1 Señal de corte de señal, interrumpir la señal de la conexión telefónica o un terminal.
  • SIGINT 2 Señal de Control-C (procedente del teclado)
  • SIGKILL 9 Señal de eliminación ningún proceso puede ignorar esta señal.
  • SIGTERM 15 Finalizar proceso de forma ordenada. Ejemplo para una BDDD, LDAP etc.. para que cierre las conexiones, ficheros etc..

Formato de kill:

kill –señal pidproceso

Ejempo de kill:

Matar una sesión ssh:

# adtasweb01 /var/opt/aat/d#ps -ef | grep ssh
    root   449     1  0   Aug 20 ?        1:01 /usr/local/sbin/sshd
    root 25618   449  0 17:51:52 ?        0:00 /usr/local/sbin/sshd -R
    ora9 18084 18082  0 20:25:28 ?        0:00 /usr/local/sbin/sshd -R
    ora9  8645  8476  0 20:22:26 ?        0:00 /usr/local/sbin/sshd –R
# kill -9  25618   
#

La señal SIGHUP comúnmente conocida como interrumpir una conexión telefónica o de Terminal, esta señal puede provocar en servicios como inetd que relean el fichero de configuración. Señal en curso

En algún momento puede interesarnos ver todas las señales enviadas a un proceso en ejecución para ello recurrimos al comando psig.

Formato:

psig pid

Ejemplo de psig:

#psig   13936
13936:  /usr/lib/ssh/sshd
HUP     default
INT     default
QUIT    default
ILL     default
TRAP    default
ABRT    default
EMT     default
FPE     default
KILL    default
BUS     default
SEGV    default
SYS     default
PIPE    ignored
ALRM    caught  0x2d7fc         RESETHAND,NODEFER
TERM    default
USR1    default
USR2    default
CLD     caught  0x40f14         0
PWR     default
WINCH   default
URG     default

Señales de proceso

  • SIGHUP 1 Señal de corte de señal, interrumpir la señal de la conexión telefónica o un terminal.
  • SIGINT 2 Señal de Control-C (procedente del teclado)
  • SIGKILL 9 Señal de eliminación ningún proceso puede ignorar esta señal.
  • SIGTERM 15 Finalizar proceso de forma ordenada. Ejemplo para una BDDD, LDAP etc.. para que cierre las conexiones, ficheros etc..
  • SIGINT 3 Salir
  • SIGILL 4 Instrucción ilegal.
  • SIGTRAP 5 Punto de ruptura
  • SIGABRT 6 Abortar
  • SIGEMT 7 Trap de emulación
  • SIGFPE 8 Excepción aritmética
  • SIGBUS 10 Error en bus
  • SIGSEGV 11 Fallo de segmentación
  • SIGSYS 12 Llamada al sistema errónea
  • SIGPIPE 13 Pipe rota
  • SIGALRM 14 Finalizada

Árbol de procesos

Disponemos de un comando llamado ptree que nos permite ver los procesos de forma jerárquica es decir podemos ver los procesos hijos desplegados de forma arbórea. El comando ptree se lanza sin opciones, veamos el ejemplo de su ejecución:

 adtasbac01 /opt/na#ptree
 51    /usr/lib/sysevent/syseventd
 60    /usr/lib/picl/picld
 137   /usr/lib/sparcv9/cpudiagd -i
 174   /usr/sbin/rpcbind
 197   /usr/sbin/inetd -s
   326   rpc.metad
   5089  in.telnetd
     5094  -ksh
       16041 bash
         28382 bash
           15728 ptree
   22123 in.telnetd
     22125 -ksh
       23114 bash
 218   /usr/lib/nfs/statd
 219   /usr/lib/nfs/lockd
 221   /usr/lib/autofs/automountd
   224   /usr/lib/autofs/automountd
 235   /usr/sbin/syslogd
 242   /usr/sbin/cron
 263   /usr/sbin/nscd
 266   /usr/lib/power/powerd

Información sobre procesos

A continuación vamos a ver una serie de comandos que nos aportaran información sobre los procesos en ejecución.

Ver las librerías en uso por un proceso

Para averiguar las librerías en uso por un proceso recurrimos al comando pldd:

pldd [PID del proceso]

El siguiente ejemplo muestra las librerías utilizadas por el proceso 6171 perteneciente a un servicio web de Sun Java:

# pldd  6717
6717:   ../../bin/https/bin/Cgistub -f /tmp/https-admserv-98ccc083/.cgistub_88
/usr/lib/libsocket.so.1
/usr/lib/libnsl.so.1
/usr/lib/libC.so.5
/usr/lib/libm.so.1
/usr/lib/libw.so.1
/usr/lib/libc.so.1
/usr/lib/libdl.so.1
/usr/lib/libmp.so.2
/usr/platform/sun4u-us3/lib/libc_psr.so.1

Descriptores de ficheros abiertos

El comando pfiles lista todos los descriptores de ficheros abiertos por un proceso:

pfiles [PID del proceso]

El resultado de la ejecución del comando pfiles para un servicio web es la siguiente:

# pfiles  6717
6717:   ../../bin/https/bin/Cgistub -f /tmp/https-admserv-98ccc083/.cgistub_88
  Current rlimit: 1024 file descriptors
   1: S_IFCHR mode:0666 dev:85,1 ino:72269 uid:0 gid:3 rdev:13,2
      O_RDWR
   2: S_IFCHR mode:0666 dev:85,1 ino:72269 uid:0 gid:3 rdev:13,2
      O_RDWR
   4: S_IFSOCK mode:0666 dev:264,0 ino:5333 uid:0 gid:0 size:0
      O_RDWR
        sockname: AF_UNIX /tmp/https-admserv-98ccc083/.cgistub_882
        peername: AF_UNIX 

Mapa de espacio de direcciones

El comando pmap muéstrela el uso que hace de la memoria un proceso mostrando una mapa del espacio de direcciones:

pmap [PID del proceso]

El siguiente ejemplo muestra la salida del comando pmap:
#pmap  6717
6717:   ../../bin/https/bin/Cgistub -f /tmp/https-admserv-98ccc083/.cgistub_88
00010000     24K read/exec         
/opt/app/SunWeb/ /bin/https/bin/Cgistub
00024000      8K read/write/exec  
 /opt/app/SunWeb/

0/bin/https/bin/Cgistub
00026000      8K read/write/exec     [ heap ]
FF080000    688K read/exec         /usr/lib/libc.so.1
FF13C000     32K read/write/exec   /usr/lib/libc.so.1
FF1B0000    224K read/exec         /usr/lib/libm.so.1
FF1F6000      8K read/write/exec   /usr/lib/libm.so.1
FF200000    312K read/exec         /usr/lib/libC.so.5
FF25C000     32K read/write/exec   /usr/lib/libC.so.5
FF264000     64K read/write/exec   /usr/lib/libC.so.5
FF280000    576K read/exec         /usr/lib/libnsl.so.1
FF310000     40K read/write/exec   /usr/lib/libnsl.so.1
FF31A000     24K read/write/exec   /usr/lib/libnsl.so.1
FF330000     16K read/exec         /usr/lib/libmp.so.2
FF344000      8K read/write/exec   /usr/lib/libmp.so.2
FF350000      8K read/write/exec   /usr/lib/libdl.so.1
FF360000      8K read/exec         /usr/platform/sun4u-us3/lib/libc_psr.so.1
FF370000      8K read/write/exec     [ anon ]
FF380000     40K read/exec         /usr/lib/libsocket.so.1
FF39A000      8K read/write/exec   /usr/lib/libsocket.so.1
FF3A0000      8K read/exec         /usr/lib/libw.so.1
FF3B0000    192K read/exec         /usr/lib/ld.so.1
FF3E0000      8K read/write/exec   /usr/lib/ld.so.1
FF3E2000      8K read/write/exec   /usr/lib/ld.so.1
FFBEA000     24K read/write/exec     [ stack ]
 total     2376K

Comando ps

A continuación veremos una serie de comandos que nos permiten observar los procesos y la carga de trabajo de las CPU del sistema. El comando ps pero en versión BSD alojado en /usr/ucb nos permite ver el consumo de CPU y memoria de los procesos:

/usr/ucb/ps -aux

El siguiente ejemplo muestra los diez primeros procesos que mas consumen recursos, se ha añade el comando head para que solo muestra los diez primeros resultados:

/#usr/ucb/ps -aux |head

USER       PID %CPU %MEM   SZ  RSS TT       S    START  TIME COMMAND
root       792  0.5  0.271760 3528 ?        S   Aug 24 588:50 /usr/lib/mixer_app
root         3  0.4  0.0    0    0 ?        S   Aug 24 842:00 fsflush
j.vazque 20211  0.4  0.1 3040 1632 ?        S 12:39:01  0:00 /usr/local/bin/cvs
root       790  0.2  1.713910434080 ?        S   Aug 24 230:50 /usr/bin/java -jar
root       438  0.2  1.04366418752 ?        S   Aug 24 189:06 /usr/openwin/bin/X
root       607  0.2  0.314600 5968 pts/2    S   Aug 24 197:45 /usr/lib/gconfd-2
root       937  0.1  0.164576 1576 ?        S   Aug 24 144:52 /usr/lib/at-spi-re
root       677  0.1  0.176912 1800 ?        S   Aug 24 147:34 gnome-panel --sm-c
root     20213  0.1  0.1 1384  952 pts/6    O 12:39:33  0:00 usr/ucb/ps –aux

Los comandos psinfo y mpstat

Los comandos psinfo y mpstat nos muestran estadísticas sobre el estado de las CPU del sistema: mpstat muestra la actividad de las CPU de forma individual, veamos la ejecución del comando mpstat:

CPU minf mjf xcal  intr ithr  csw icsw migr smtx  srw syscl  usr sys  wt idl
  1    7   1  120   412  309  168    4   21    3    0   638    1   4   0  95
  3    7   1   13   115  107  179    7   21    3    0   633    1   3   0  96

La información más importante que vemos en el resultado de la ejecución del comando es:

  • mjf que corresponde con fallos importantes.
  • minf que corresponde con fallos de menor importancia.
  • xcal aporta información sobre la llamada entre las CPU.
  • intr indica el número de interrupciones.
  • csw cambios de contexto.
  • icsw cambios de contexto involuntarios.
  • syscl número de llamadas al sistema
  • usr indica en % el tiempo consumido por los procesos de usuario.
  • sys % de tiempo de CPU consumido por los procesos del sistema.
  • idl % de tiempo libre de CPU

El comando psrinfo mostrará el estado de las CPU y cuando se iniciaron. Ejemplo de la salida del comando psrinfo:

#psrinfo
0       on-line   since 10/04/07 09:03:13
1       on-line   since 10/04/07 09:03:13
2       on-line   since 10/04/07 09:03:13
3       on-line   since 10/04/07 09:03:13
4       on-line   since 10/04/07 09:03:13
5       on-line   since 10/04/07 09:03:13
6       on-line   since 10/04/07 09:03:13
7       on-line   since 10/04/07 09:03:01
16      on-line   since 10/04/07 09:03:13
17      on-line   since 10/04/07 09:03:13
18      on-line   since 10/04/07 09:03:13
19      on-line   since 10/04/07 09:03:13
20      on-line   since 10/04/07 09:03:13
21      on-line   since 10/04/07 09:03:13
22      on-line   since 10/04/07 09:03:13
23      on-line   since 10/04/07 09:03:1
Personal tools