procesos
From Genunix
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
