martes, 22 de enero de 2008

tema 4

Gestión de procesos En el tema anterior vimos como ejecutar comandos del shell:
otros comandos ajenos al shell se ejecutan igual En cada momento se están ejecutando un gran número de procesos:
-procesos de sistema (kernel, daemons)
-procesos de usuarios En esta sección trataremos la gestión de los procesos que se están ejecutando:
listar procesos en ejecución
detener y matar procesos
controlar la prioridad de ejecución

Ver los procesos en ejecución Existen varias herramientas para ver los procesos en ejecución, la más importante es el comando ps
ps (process status) lista los procesos con su PID, datos de usuario, tiempo, identificador del proceso y linea de comandos usada $ ps
PID TTY TIME CMD
6368 pts/0 00:00:00 bash
7441 pts/0 00:00:00 ps
sin opciones, ps sólo muestra los procesos lanzados desde el terminal actual y con el mismo EUID que el usuario que lo lanzó
Opciones de ps: ps tiene un gran número de opciones, que se pueden especificar de 3 maneras:
opciones UNIX: pueden agruparse y se preceden por un guión: ps -ef
opciones BSD: pueden agruparse y van sin guión: ps uxa
opciones largas GNU: precedidas de dos guiones: ps --user tomas Algunas opciones:
-e o ax: muestra todos los procesos
-u (o U o --user) usuario: muestra los procesos de un usuario
u: salida en formato usuario
j: salida en formato job (muestra PID, PPID, etc.)
-f o l: salida en formato largo
f: muestra un árbol con la jerarquía de procesos
k (o --sort) campo: ordena la salida por algún campo (p.e. ps uxak rss)
-o (o o o --format) formato: permite definir el formato de salida ps -o ruser,pid,comm=Comando para más opciones ver la página de manual de ps
Ejemplo: $ ps axu
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 1516 536 ? S 09:43 0:00 init [2]
root 2 0.0 0.0 0 0 ? S 09:43 0:00 [migration/0]
root 3 0.0 0.0 0 0 ? SN 09:43 0:00 [ksoftirqd/0]
root 4 0.0 0.0 0 0 ? S 09:43 0:00 [migration/1]
.............
tomas 6475 0.1 4.9 140180 50920 ? Sl 09:51 0:18 /usr/lib/mozilla-thunderbird/mozilla-thunderbird-bin
tomas 6528 0.2 3.6 116396 37948 ? Sl 10:01 0:25 /usr/lib/mozilla-firefox/firefox-bin -a firefox
en este ejemplo:
%CPU y %MEM: porcentajes de uso de CPU y memoria
VSZ: memoria virtual del proceso, en KBytes
RSS: tamaño de la memoria residente (resident set size) en KBytes
STAT: estado del proceso; puede ser:
Código significado
D Uninterruptible sleep (usualmente IO)
R Ejecutándose(running) o en cola de ejecución
S Interruptible sleep (p.e. esperando un evento)
T Detenido
Z Proceso zombiecuando se usa formato BSD puede aparecer otro código acompañando al principal:
Código significado
< alta prioridad
N baja prioridad
L páginas bloqueadas (locked) en memoria
s líder de sesión
l multi-threaded
+ proceso en foreground
pstree muestra el árbol de procesos (similar a ps f) init-+-acpid
top

ps da una versión estática de los procesos
top nos da una lista actualizada a intervalos

EJEMPLO

top - 17:34:08 up 7:50, 6 users, load average: 0.12, 0.31, 0.27
Tasks: 111 total, 1 running, 110 sleeping, 0 stopped, 0 zombie
Cpu(s): 6.2% us, 2.0% sy, 0.0% ni, 91.0% id, 0.0% wa, 0.8% hi, 0.0% si
Mem: 1026564k total, 656504k used, 370060k free, 65748k buffers
Swap: 2048248k total, 0k used, 2048248k free, 336608k cached


PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6130 root 15 0 63692 48m 9704 S 8.7 4.9 8:03.34 XFree86
6341 tomas 15 0 14692 8852 6968 S 4.3 0.9 1:55.13 metacity
6349 tomas 16 0 32792 14m 9232 S 1.3 1.5 0:41.60 gnome-terminal
6019 tomas 15 0 7084 3184 1896 D 0.3 0.3 0:23.22 famd
6401 tomas 15 0 16756 8280 6856 S 0.3 0.8 0:02.49 geyes_applet2
6427 tomas 15 0 18288 10m 8112 S 0.3 1.0 0:09.04 wnck-applet
7115 tomas 15 0 26312 13m 11m S 0.3 1.4 0:00.61 kio_uiserver
7390 tomas 15 0 45016 30m 18m S 0.3 3.0 0:38.69 kile
1 root 16 0 1516 536 472 S 0.0 0.1 0:00.61 init
2 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0

en la cabecera nos muestra un resumen del estado del sistema
hora actual, tiempo que el sistema lleva encendido, el número de usuarios conectados y la carga media del sistema para los últimos 1, 5, y 15 minutos
número total de tareas y resumen por estado
estado de ocupación de la CPU y la memoria
por defecto, los procesos se muestran ordenados por porcentaje de uso de CPU (los más costosos arriba) pulsando h mientras se ejecuta top, obtenemos una lista de comandos interactivos
para salir, q
Algunos campos de top
VIRT: Tamaño total del proceso (código, datos y librerías compartidas cargadas), VIRT=SWAP+RES
SWAP: Memoria que ha sido swapped out o que aún no ha sido cargada
RES: Memoria residente (RAM ocupada por el proceso)
CODE y DATA: Memoria ocupada por el código y datos (datos y pila, pero no librerías compartidas) del proceso
SHR: Memoria compartida (memoria que puede ser compartida con otros procesos)
P: Última CPU usada (SMP)
nFLT: Número de fallos de página para el proceso
strace Muestra las llamadas al sistema realizadas por un proceso en ejecución
Ejemplo de un strace sobre un top en ejecución $ strace top
Manipulación de procesos Ya hemos visto que mediante Ctrl-C y Ctrl-Z podemos terminar y detener un proceso:
esas combinaciones envían señales a los procesos el comando básico para enviar señales a un proceso es kill.El comando kill Permite enviar señales a los procesos
kill -l lista el conjunto de señales $ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD
18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN
22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO
30) SIGPWR 31) SIGSYS ....
para ver su significado, ver man 7 signal Sintaxis de kill
kill [señal] PID
señal puede indicarse mediante el número o el código:
kill -9 y kill -KILL son equivalentes
las señales más comunes son:
SIGHUP (1): cuelgue del terminal o muerte del proceso controlador
SIGTERM (15): mata el proceso permitiéndole terminar correctamente
SIGKILL (9): mata el proceso sin permitirle terminar
SIGSTOP (19): para el proceso
SIGCONT (18): continúa si parado
SIGINT (2): interrupción de teclado (Ctrl-C)
SIGTSTP (20): stop de teclado (Ctrl-Z)
SIGQUIT (3): salida de teclado (Ctrl-\) Algunas características de las señales:
La señal que se envía por defecto es TERM (15)
los procesos pueden ignorar esta señal y no terminar
las señales KILL (9) y STOP (19) no pueden ignorarse
En bash, cuando enviamos una señal SIGHUP a un shell, este se lo reenvía a todos sus hijos
Cuando cerramos un terminal en un entorno gráfico, o abandonamos una sesión, se envía un SIGHUP a todos sus hijos
La mayoría de los demonios (daemons) responden a la señal SIGHUP volviendo a leer sus ficheros de configuración:
en vez de matar y reiniciar un demonio podemos hacer un kill -HUP para reiniciarlo
Otros comandos
pgrep busca en la lista de procesos para localizar el PID a partir del nombre (similar a ps grep)
Ejemplo: $ pgrep -u root sshd # PID del proceso sshd de root
pkill permite enviar señales a los procesos indicándolos por nombre en vez de por PID
Ejemplo:
$ pkill -9 proceso
si hay varios procesos con el mismo nombre los mata a todos
en vez de un nombre admite un patrón (p.e. pkill ´l.*´)
tener cuidado con su uso (es fácil matar procesos de forma errónea)
killall similar a pkill, pero no admite patrones en el nombre, y tiene otras opciones
nohup normalmente, cuando salimos de un login shell (logout) o cerramos una un terminal, se envía una señal SIGHUP a todos los procesos hijos1:
si lanzamos un proceso en background y salimos de la sesión el proceso se muere al morir el shell desde el que lo iniciamos El comando nohup permite que un lanzar un comando ignorando las señales SIGHUP
nohup comando
la salida del comando se redirige al fichero nohup.out
exec como ya vimos, exec ejecuta un comando reemplazando al shell desde el que se lanza:
es otra forma de crear un proceso que no se muere al morirse su shell,
Manejo de la prioridad

Manejo de la prioridad y recursos de un proceso Cuando un proceso se ejecuta, lo hace con una cierta prioridad
las prioridades van desde -20 (prioridad más alta) a 19 (prioridad más baja)
por defecto, los procesos se ejecutan con prioridad 0
un usuario normal solo puede asignar prioridades más bajas (números positivos)
root puede asignar prioridades más altas (números negativos)
los comandos para manejo de prioridades son nice y renice
nice Permite lanzar un comando con una cierta prioridad
Sintaxis
nice -n ajuste comando la prioridad por defecto se modifica por ajuste
Ejemplo: $ nice -n 10 abiword & # disminuye la prioridad en 10
$ ps -o pid,pri,ni,stat,cmd
PID PRI NI STAT CMD
7133 24 0 Ss bash
7431 14 10 SN abiword
7552 23 0 R+ ps -o pid,pri,ni,stat,cmd
$ nice -n -1 abiword
nice: no se puede establecer la prioridad: Permiso denegado
renice Permite cambiar la prioridad de un proceso que está en ejecución
Sintaxis:
renice pri [-p pid] [-g pgrp] [-u user]
las opciones son:
-p pid cambia la prioridad para el proceso especificado
-g pgrp cambia la prioridad para los procesos ejecutados por los usuarios que pertenecen al grupo con ID=pgrp
-u user cambia la prioridad para los procesos del usuario especificado
Control de los recursos de un proceso El comando interno de bash ulimit permite controlar los recursos de los que dispone un proceso arrancado por el shell
Sintaxis
ulimit [opciones] [limite]
Algunas opciones:
-a muestra los límites actuales
-f máximo tamaño de los ficheros creados por el shell (opción por defecto)
-n máximo número de ficheros abiertos
-s máximo tamaño de la pila
-t máximo tiempo de cpu
-S/-H usa los límites soft y hard
el usuario puede incrementar su límite blando, pero sin superar el límite duro
estos límites pueden ser fijados en el /etc/profile, /etc/bash.bashrc
Para más información help ulimit
Ejemplo: limitar el tamaño de los ficheros creados a 1 KByte
$ ulimit -f 1

Análisis básico del rendimiento del sistema Además de ps y top existen comandos básicos que nos pueden mostrar el estado del sistema en cuanto a uso de CPU y consumo de memoria2
uptime Muestra la hora actual, el tiempo que el sistema lleva encendido, el número de usuarios conectados y la carga media del sistema para los últimos 1, 5, y 15 minutos (lo mismo que en la primera línea de top)
Ejemplo: $ uptime
20:25:03 up 25 days, 11:12, 13 users, load average: 3.00, 3.07, 3.08
w Además de la información dada por uptime, el comando w muestra información sobre los usuarios y sus procesos

free Muestra la cantidad de memoria libre y usada en el sistema, tanto para la memoria física como para el swap, así como los buffers usados por el kernel (similar a lo mostrado en la cabecera de top)
la columna shared no significa nada (obsoleta)
Opciones:
-b,-k,-m,-g memoria en bytes/KBytes/MBytes/GBytes
-t muestra una línea con el total de memoria (física + swap)
-s delay muestra la memoria de forma continua, cada delay segundos Herramientas gráficas Además de los comandos comentados, si disponemos de un entorno X Windows podemos usar alguna herramienta gráfica en vez de top y ps:
proporcionan una visión más clara y son fáciles de usar Algunas herramientas son
gnome-system-monitor: visor de procesos y monitorizador de recursos del sistema de GNOME
KDE System Guard (ksysguard): gestor de tareas y monitor de rendimiento de KDE
Ejemplo: gnome-system-monitor

El directorio /proc Pseudofilesystem que guarda información sobre el sistema y los procesos
se inicializa durante el arranque
está implementado en memoria y no se guarda en disco
la estructura del directorio /proc depende de la versión del kernel
los comandos vistos (ps, top, etc.) obtienen la información sobre los procesos de este directorio En el tema 2 vimos algo del contenido de /proc (ficheros interrupts, ioports y dma); otros ficheros son:
cpuinfo: información estática de la CPU
meminfo: información de uso de la memoria
partitions: información sobre las particiones
filesystems: sistemas de ficheros soportados por el kernel
version: versión y fecha del kernel
bus/: directorio con información de los buses PCI y USB
cmdline: línea de arranque del kernel
devices: dispositivos del sistema de caracteres o bloques
ide/: directorio con información del bus IDE
modules: módulos del kernel
net/: directorio con información de red Además, existen un directorio por cada proceso, que se identifica con el PID del proceso, en el que se puede encontrar información sobre cada proceso, incluidos:
el directorio desde que se invoco el proceso (enlace cwd)
nombre del ejecutable (enlace exe) y la línea de comandos con la que fue invocado (fichero cmdline)
entorno en que se ejecuta el proceso (fichero environ)
estado del proceso (fichero status)
descriptores de ficheros abiertos y archivos o procesos relacionados (directorio fd)
mapa de memoria (fichero maps) Nota: en el kernel 2.6 de Linux aparece un nuevo pseudofilesystem (/sys) que reemplaza al /proc en lo que se refiere a visualización y ajuste de dispositivos