Procesos
Un proceso, como hemos visto en secciones anteriores, es una abstracción que incluye:
- Una aplicación en ejecución
- Sus variables de entorno
- Información para identificarlo y para determinar su propietario
- El estado de entrada y salida de la aplicación
- El estado del proceso, incluyendo su prioridad y uso de recursos
El comando ps
El comando ps muestra por pantalla los comandos que se están ejecutando en un sistema.
Por defecto sólo se muestran "mis" procesos con un conjunto de información reducida
luciag@pluton:~> ps
PID TTY TIME CMD
25193 pts/2 0:00 tcsh
En este caso veo que tengo una aplicación en ejecución, que es la shell.
Si ejecuto otro proceso, por ejemplo, un find
luciag@pluton:~> find . -name mifichero > /dev/null &
[1] 25268
luciag@pluton:~> ps
PID TTY TIME CMD
25193 pts/2 0:00 tcsh
25268 pts/2 0:00 find
El 25268 es el PID, o identificador del proceso.
Si quiero que termine, lo mato:
luciag@pluton:~> kill 25268
Si quiero ver todos los procesos, hay opciones "específicas".
En Solaris ps -ef (he cortado los tres primeros)
luciag@pluton:~> ps -ef
UID PID PPID C STIME TTY TIME CMD
root 0 0 0 Jun 22 ? 0:13 sched
root 1 0 0 Jun 22 ? 0:08 /etc/init -
root 2 0 0 Jun 22 ? 0:00 pageout
root 3 0 0 Jun 22 ? 68:34 fsflush
[...]
Características de un proceso
El PID: Cuando lanzamos un comando, se le asigna un identificador de proceso único, en orden creciente y comenzando desde cero (los primeros procesos son "de sistema").
El PPID: La creación de nuevos procesos en Unix se realiza por la vía de duplicar un proceso existente invocando al comando fork(). Al proceso original se le llama "padre" y al nuevo proceso "hijo". El PPID de un proceso es el PID de su proceso padre.
El UID: Propietario del proceso, el que lo echó a correr, normalmente. Este usuario y root son los únicos que podrán hacer cosas con él, como matarlo.
El EUID: Puede ser distinto que el UID si se lanzó el proceso con setuid.
Entorno de un proceso
El entorno de un proceso está compuesto por las variables de entorno. Como vimos, hay variables de entorno globales, que son heredadas por los procesos hijos, y variables de shell o
Todos los procesos tienen asociadas variables como el directorio actual: $cwd o $PWD
Terminal de control.
En general los procesos están asociados a una terminal de control. Esta terminal determina el valor por defecto de los archivos stdin, stdout y stderr del proceso.
Una excepción a esto son los procesos llamados daemons, que una vez lanzados se desvinculan de su terminal de control y siguen ejecutando inclusive después de cerrada la sesión de usuario desde la cual se lanzaron
Opciones del comando ps
El comando tiene distintas opciones según el sistema operativo. En Linux, por ejemplo, con la opción -F vemos un listado "full" de nuestros procesos:
luciag@luna.acme.com:/usr/bin> ps -F
UID PID PPID C SZ RSS PSR STIME TTY TIME CMD
luciag 5065 5064 0 18906 2544 1 09:30 pts/2 00:00:00 -tcsh
luciag 7041 5065 0 17471 1112 2 10:36 pts/2 00:00:00 ps -F
mientras que en Solaris no existe y debemos conformarnos con la -f.
luciag@pluton:~> ps -f
UID PID PPID C STIME TTY TIME CMD
luciag 25193 25191 0 12:56:41 pts/2 0:00 -tcsh
En Linux vemos dos columnas muy interesantes, relativas al consumo de memoria. RSS es el "resident set size" o memoria física en uso, y SZ (o VSZ) es el "virtual size" o tamaño del espacio de direcciones virtual, memoria direccionada por el proceso.
Para obtener esas opciones en Solaris podemos recurrir a la opción -o para hacernos nuestro propio ps a medida.
En Linux vemos dos columnas muy interesantes, relativas al consumo de memoria. RSS es el "resident set size" o memoria física en uso, y SZ (o VSZ) es el "virtual size" o tamaño del espacio de direcciones virtual, memoria direccionada por el proceso.
luciag@pluton:~> ps -ouid,pid,ppid,c,vsz,rss,stime,tty,time,fname
UID PID PPID C VSZ RSS STIME TT TIME COMMAND
20073 25193 25191 0 2696 2264 12:56:41 pts/2 0:00 tcsh
Existe una utilidad muy popular similar al taskmgr de Windows que es el top. Es un ps de todo el sistema que nos ordena por cierto criterio (normalmente por consumo de CPU o memoria) y va actualizando la salida por pantalla.
Procesos en background y nohup.
Los comandos de shell de UNIX pueden lanzarse en background añadiendo & al final. Esto significa que permitirán que sigamos utilizando la shell mientras ellos se ejecutan.
luciag@pluton:~> find . -name mifichero > /dev/null &
[1] 25415
luciag@pluton:~> jobs
[1] + Running find . -name mifichero > /dev/null
Cuando el comando se complete dirá por pantalla lo que ha ocurrido.
luciag@pluton:~>
[1] Done find . -name mifichero > /dev/null
Este comando tiene asociada la terminal. Si queremos que cuando nos marchemos de la sesión de la terminal el comando siga ejecutándose tenemos que usar nohup. Esto "desposee" al proceso de su terminal.
luciag@pluton:~> nohup find . -name mifichero > /dev/null &
[1] 25415
luciag@pluton:~> exit
Prioridades
Cuando hay más de un proceso listo para ejecutar, el kernel asigna el uso de CPU al proceso que tenga más prioridad. En UNIX esto varía dinámicamente, según el sistema operativo se utiliza un algoritmo que procura ser justo con los distintos procesos dando prioridad a los interactivos. Suelen tener en cuenta cuánto uso de CPU ha hecho el proceso últimamente, etc.
El usuario de un proceso puede querer influir en el algoritmo de prioridad con el comando nice. Este es un número que se asigna al proceso para ver cómo de "nice" (majete) es el comando con los demás. Cuanto más nice, más desventaja (todos le atropellan).
En los sistemas "tipo BSD" el valor del número nice puede variar entre -20 y +20, siendo por defecto 0. En los sistemas "tipo SysV" los valores posibles van de 0 a 39, siendo 20 el valor por defecto. Se puede modificar el valor nice por defecto en el momento de lanzar un programa lanzándolo a correr con el comando nice, o posteriormente utilizando el comando renice.
Estados de un procesoCuando se inicia un proceso, puede quedarse en uno de los siguientes estados:
- Ejecutándose (running): Básicamente haciendo su trabajo, bien en modo usuario o kernel. - Listo pero esperando (runnable): Esperando su cuanto de CPU. - Durmiendo (asleep): Esperando un recurso compartido (disco, red, etc)
Además de estos estados básicos podemos pararlo (stopped) o continuarlo. Y en ciertos casos "problemáticos" el proceso puede quedarse "zombie".

En los sistemas "tipo BSD" el valor del número nice puede variar entre -20 y +20, siendo por defecto 0. En los sistemas "tipo SysV" los valores posibles van de 0 a 39, siendo 20 el valor por defecto. Se puede modificar el valor nice por defecto en el momento de lanzar un programa lanzándolo a correr con el comando nice, o posteriormente utilizando el comando renice.
Estados de un proceso
Cuando se inicia un proceso, puede quedarse en uno de los siguientes estados:
- Ejecutándose (running): Básicamente haciendo su trabajo, bien en modo usuario o kernel.
- Listo pero esperando (runnable): Esperando su cuanto de CPU.
- Durmiendo (asleep): Esperando un recurso compartido (disco, red, etc)
Además de estos estados básicos podemos pararlo (stopped) o continuarlo. Y en ciertos casos "problemáticos" el proceso puede quedarse "zombie".
Proceso zombi: proceso parado que queda en la tabla de procesos hasta que termine su padre. Este hecho se produce cuando el proceso padre no recoge el código de salida del proceso hijo.Proceso huérfano: proceso en ejecución cuyo padre ha finalizado. El nuevo identificador de proceso padre (PPID) coincide con el identificador del proceso init (1).
Cancelar procesos
Si queremos cancelar la ejecución de un proceso, podemos utilizar el comando kill.Si conocemos el PID usaremos kill PID
luciag@pluton:~> find . -name mifichero > /dev/null &[1] 25440luciag@pluton:~> psPID TTY TIME CMD25193 pts/2 0:00 tcsh25440 pts/2 0:01 findluciag@pluton:~> kill 25440luciag@pluton:~>[1] Terminated find . -name mifichero > /dev/null
O si nos gusta más el comando jobs usaremos kill %job
luciag@pluton:~> find . -name mifichero > /dev/null &[1] 25442luciag@pluton:~> jobs[1] + Running find . -name mifichero > /dev/nullluciag@pluton:~> kill %1luciag@pluton:~>[1] Terminated find . -name mifichero > /dev/null
Una vez leí un artículo de cómo usar el doom para matar procesos. Muy divertido pero poco útil.
Señales
Las señales de UNIX son un mecanismo para anunciar a un proceso que ha sucedido un evento que debe atender. Cuanto estamos usando el comando kill le estamos mandando una de las siguientes señales al proceso- Señal SIGTERM: kill -15 PID (que tenga a bien terminar)
- Señal SIGKILL: kill -9 PID (que termine por la fuerza)
Pero existen más señales. - kill -STOP PID: Pausa el proceso (con el teclado CTRL-Z)
- kill -CONT PID: Lo reanuda
Si de repente hemos pausado un proceso y queremos que se siga ejecutando en el background (porque se nos ocurre que queremos seguir tecleando, por ejemplo) escribimos bg
Lo pasaríamos al frente con fg.
Proceso zombi: proceso parado que queda en la tabla de procesos hasta que termine su padre. Este hecho se produce cuando el proceso padre no recoge el código de salida del proceso hijo.
Proceso huérfano: proceso en ejecución cuyo padre ha finalizado. El nuevo identificador de proceso padre (PPID) coincide con el identificador del proceso init (1).
Cancelar procesos
Si queremos cancelar la ejecución de un proceso, podemos utilizar el comando kill.
Si conocemos el PID usaremos kill PID
luciag@pluton:~> find . -name mifichero > /dev/null &
[1] 25440
luciag@pluton:~> ps
PID TTY TIME CMD
25193 pts/2 0:00 tcsh
25440 pts/2 0:01 find
luciag@pluton:~> kill 25440
luciag@pluton:~>
[1] Terminated find . -name mifichero > /dev/null
O si nos gusta más el comando jobs usaremos kill %job
luciag@pluton:~> find . -name mifichero > /dev/null &
[1] 25442
luciag@pluton:~> jobs
[1] + Running find . -name mifichero > /dev/null
luciag@pluton:~> kill %1
luciag@pluton:~>
[1] Terminated find . -name mifichero > /dev/null
- Señal SIGTERM: kill -15 PID (que tenga a bien terminar)
- Señal SIGKILL: kill -9 PID (que termine por la fuerza)
- kill -STOP PID: Pausa el proceso (con el teclado CTRL-Z)
- kill -CONT PID: Lo reanuda
Si de repente hemos pausado un proceso y queremos que se siga ejecutando en el background (porque se nos ocurre que queremos seguir tecleando, por ejemplo) escribimos bg
Threads
Un proceso puede tener muchas secuencias de ejecución o hilos. Varias secuencias de ejecución (threads) pueden agruparse en un proceso y compartir algunos segmentos de memoria.
Existen opciones dentro del comando ps para examinar cómo los hilos se asocian a procesadores virtuales. Por lo menos, en Solaris, podemos ver los hilos. .
luciag@pluton:~> ps -e -olwp,fname,pid,fname,args | grep jrun 1 jrun 7334 jrun jrun -config ess.config -nohup -start ess 2 jrun 7334 jrun jrun -config ess.config -nohup -start ess 3 jrun 7334 jrun jrun -config ess.config -nohup -start ess 4 jrun 7334 jrun jrun -config ess.config -nohup -start ess(he cortado por obvio el resto de LWPs)
Cotilleando el /proc filesystem
En Solaris, AIX y Linux, los procesos escriben a un sistema de ficheros especial llamado el /proc filesystem. Este filesystem contiene información especial de los procesos, que se puede utilizar leyendo desde los llamados comandos p*, que son similares en Solaris y AIX/Linux.
Solaris AIX, Linux pflags [-r] [pid | core] procflags [-r] [pid] pcred [pid | core] proccred [pid] pmap [-rxIF] [pid | core] procmap [-F] [pid] pldd [-F] [pid | core] procldd [-F] [pid] pstack [-F] [pid | core] procstack [-F] [pid] pfiles [-F] [pid] procfiles [-nF] [pid] ptime command [argument] Not available
Los más interesantes son pstack y pfiles. pstack me permite obtener un listado del stack por thread de llamadas al sistema. pfiles me permite obtener información sobre todos los descriptores de archivo abiertos por un proceso.
Bibliografía
Threads
Un proceso puede tener muchas secuencias de ejecución o hilos. Varias secuencias de ejecución (threads) pueden agruparse en un proceso y compartir algunos segmentos de memoria.
Existen opciones dentro del comando ps para examinar cómo los hilos se asocian a procesadores virtuales. Por lo menos, en Solaris, podemos ver los hilos. .
luciag@pluton:~> ps -e -olwp,fname,pid,fname,args | grep jrun
1 jrun 7334 jrun jrun -config ess.config -nohup -start ess
2 jrun 7334 jrun jrun -config ess.config -nohup -start ess
3 jrun 7334 jrun jrun -config ess.config -nohup -start ess
4 jrun 7334 jrun jrun -config ess.config -nohup -start ess
(he cortado por obvio el resto de LWPs)
Cotilleando el /proc filesystem
En Solaris, AIX y Linux, los procesos escriben a un sistema de ficheros especial llamado el /proc filesystem. Este filesystem contiene información especial de los procesos, que se puede utilizar leyendo desde los llamados comandos p*, que son similares en Solaris y AIX/Linux.
| Solaris | AIX, Linux |
| pflags [-r] [pid | core] | procflags [-r] [pid] |
| pcred [pid | core] | proccred [pid] |
| pmap [-rxIF] [pid | core] | procmap [-F] [pid] |
| pldd [-F] [pid | core] | procldd [-F] [pid] |
| pstack [-F] [pid | core] | procstack [-F] [pid] |
| pfiles [-F] [pid] | procfiles [-nF] [pid] |
| ptime command [argument] | Not available |
Los más interesantes son pstack y pfiles.
pstack me permite obtener un listado del stack por thread de llamadas al sistema.
pfiles me permite obtener información sobre todos los descriptores de archivo abiertos por un proceso.
No hay comentarios:
Publicar un comentario