Gestión de procesos

Un proceso es un programa en ejecución. Para almacenar la información de cada proceso los sistemas operativos usan estructuras de datos en las que se almacena todo su entorno de ejecución (memoria, estado, identificación, propietario, proceso padre, …). Con más detalle, los datos de identificación de un proceso son:

  • Un número de proceso único PID (Process ID): cada proceso se numera para diferenciarlo del resto. El primer proceso iniciado por el sistema tiene PID 1 y suele llamarse init. El resto de procesos son hijos (directa o indirectamente) de este. Si iniciamos varias veces el mismo programa se va a generar un proceso para cada ejecución, cada uno con un PID diferente.
  • Un numero de proceso padre PPID (Parent Process ID): cada proceso puede iniciar otros procesos, a estos procesos se les llama procesos hijo. Cada proceso hijo debe contener entre toda su información el PID del proceso padre que lo inició. Todos los procesos tienen un PPID salvo el proceso init.
  • Un número de usuario y uno de grupo: corresponde al UID y al GID de la cuenta de usuario que inicia el proceso. Permiten al sistema determinar los permisos que los procesos tienen para acceder a los recursos. Un proceso con UID 0 es privilegiado ya que son ejecutados por el root.Los procesos hijos heredan ambas cuentas (aunque en algunos casos se puede modificar este comportamiento)
  • Duración y prioridad del proceso: la duración se corresponde al tiempo de ejecución del proceso consumido desde la última invocación. Dado que Linux es un entorno multitarea, el tiempo de4 procesador se comparte entre los procesos y no todos tienen la misma prioridad; los procesos de más alta prioridad son ejecutados primero. Cuando un proceso está inactivo su prioridad aumenta con el fin de tener prioridad de ser ejecutado. Cuando está activo, su prioridad baja con el fin de dejar paso a otro. El planificador de tareas del sistema es el que gestiona las prioridades y los tiempos de ejecución.
  • Directorio de trabajo activo: es el directorio en el que se inicio el proceso. Este directorio servirá de base para las rutas relativas.
  • Archivos abiertos: tabla con los descriptores de los archivos abiertos. Con cada apertura de archivo o de nuevo canal la tabla se rellena. Al cierre del proceso se cierran los descriptores.

Los procesos durante su ejecución pasan por distintos estados, algunos de ellos:

  • S (sleeping) el proceso está en espera.
  • R (running) el proceso está en ejecución.
  • T (stop) el proceso se encuentra parado.
  • D proceso que se encuentra bloqueado a la espera de un recurso.
  • Z (zombie) es un proceso que se encuentra en estado zombie, es decir, que es un proceso que ha finalizado pero que su proceso padre sigue en ejecución y no se ha “dado cuenta” de la circunstancia de su proceso hijo.

Cualquier proceso puede estar en primer o segundo plano, aunque hemos de tener en cuenta que en el terminal en que estemos trabajando solo puede haber un proceso en primer plano.

La utilidad de enviar un programa a segundo plano es que muchas tareas no requieren de la interacción del usaurio para que se ejecuten y pueden requerir de mucho tiempo para finalizar. Por ejemplo, descargar algún archivo de Internet, compilar un programa, hacer una búsqueda en el sistema de archivos, etc.

Si ejecutamos:

xclock -d -update 1

Se nos lanzará un programa gráfico que nos muestra una ventana con un reloj digital que se actualiza cada segundo. Este proceso toma el control del terminal y no podemos ejecutar ninguna otra acción.

xclock

Si tecleamos la combinación de teclas ctrl+z le envíamos al proceso la señal de detener. El proceso sigue en el escritorio, pero se ha detenido y el proceso ha pasado a segundo plano:

$ xclock -d -update 1
^Z
[1]+  Detenido                xclock -d -update 1

Entre corchetes [1] se nos indica además el número de tarea, 1 en este caso. Podemos reiniciar el reloj y traerlo a primer plano ejecutando:

$ fg %1 xclock -d -update 1

También se puede usar el nombre de comando o parte de él escribiendo fg %xclock o fg %?clo. Finalmente, si simplemente se ejecuta fg sin parámetros, también permite reiniciar el trabajo detenido más recientemente, el trabajo 1 en este caso

Al traerlo a primer plano ya no podremos interactuar con el terminal.

Una tarea que tenemos en segundo plano interrumpida, la podemos reanuada con bg pasándole como parámetro el número de tarea.

$ xclock -d -update 1
^Z
[1]+  Detenido                xclock -d -update 1
$ bg %1
[1]+ xclock -d -update 1 &

El proceso se reanudará y se ejecutará en segundo plano. Ya el mensaje no pone Detenido y estará terminado por el signo de ampersand (&)

Si por el contrario, lo que queremos es finalizar un trabajo que está en primer plano lo podemos hacer con la combinación de teclas Ctrl+c

$ xclock -d -update 1 &
[1] 21854
$ fg
xclock -d -update 1
^C

No es necesario suspender un proceso para ponerlo en segundo plano; lo podemos ejecutar directamente en segundo plano poniendo & al final del comando.

Vamos a ejecutar un reloj analógico directamente en segundo plano:

$ xclock -bg wheat -update 1&

En este caso, el mensaje de salida es distinto. Se muestra el número de trabajo y el PID del mismo.

El comando jobs nos muestra las tareas del terminal actual que se ejecutando en segundo plano. Si utilizamos la opción -l se nos mostrará además el PID de cada uno de esos trabajos:

$ jobs -l
[1]- 20924 Ejecutando              xclock -d -update 1 &
[2]+ 20955 Ejecutando              xclock -bg wheat -update 1 &

Podemos finalizar procesos que se estén ejecutando en segundo plano utilizando la orden kill %n donde n es el número del trabajo

$ xeyes &
[1] 22555
$ kill %1

Si queremos que un trabajo se siga ejecutando despues de cerrar el terminal, lo podemos hacer desvínculándolo del mismo con el comando disown pasando como parámetro el número del trabajo

Ejemplo:

$ ping -i 5 rediris.es > ping.txt &
[1] 4392
$ disown %1

Si cerramos el terminal en el que iniciamos el trabajo y abrimos otro, el proceso estará en ejecución, pero no estará asociado a ningún terminal

$ jobs
$ ps -u usuario
  PID TTY          TIME CMD
 1511 tty1     00:00:00 bash
 4392 ?        00:00:00 ping
 4613 pts/4    00:00:00 bash
 4634 pts/4    00:00:00 ps

==== Aspectos a tener en cuenta con los procesos en segundo plano ====

  El proceso iniciado en segundo plano no debería mostrar resultados por pantalla porque entarían en conflicto con los del terminal.
  Si cerramos el terminal se cierran también todos sus procesos hijos y por tanto también se cerrarían los trabajos que se estén ejecutando en segundo plano.
  El proceso en segundo plano no debería ser otro terminal (shell) ya que podría causar confusión entre este comando y el propio shell

El comando kill nos permite enviar señales a los procesos. A diferencia de lo que parece indicar su nombre, la función de este comando no es obligatoriamente destruir o terminar un proceso; existen otros tipos de señales.

Cuando se manda una señal a un proceso este debe interceptarla y actuar en consecuencia. Algunas señales pueden ser ignoradas por los procesos, pero otras no.

Un usuario administrador puede enviar señales a cualquier proceso, pero un usaurio normal solo puede enviar señales a procesos de los que es propietario o sobre los que tiene permiso.

Para ver las señales disponibles podemos ejecutar:

$ 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
16) SIGSTKFLT   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      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

Si no se especifica el tipo de señal que se le quiere mandar a un proceso por defecto se envía la señal 15 SIGTERM con esta señal se le está indicando al proceso que debe terminar con normalidad.

Ejemplo, envío de señal SIGTERM a varios procesos:

$ kill 3453 2234 3433

La señal 20 SIGSTP solicita a un proceso que se detenga y lo pasa a un segundo plano. Es el equivalente a usar la combinación de teclas ctrl+z en proceso que se está ejecutando en primer plano

La señal 2 SIGINT solicita a un proceso que interrumpa su ejecución. Es el equivalente a usar la combinación de teclas ctrl+c en un proceso que se está ejecutando en primer plano.

Para forzar que uno o varios procesos terminen de forma inmediata usamos la señal 9 SIGKILL

$ kill -9 6733

Si queremos enviar una señal a todos los procesos con un determinado nombre podemos utilizar killall

$ xeyes &
[2] 22041
$ xeyes &
[3] 22042
$ killall -9 xeyes
Si queremos interrumpir un programa gráfico podemos utilizar xkill. Al ejecutarlo la flcha del ratón se convertirá en un aspa y cerrar el proceso asociado a la ventana sobre la que hagamos click.

Informa del estado de los procesos. Tiene varias opciones para mostrar diferentes columnas.

Entre las columnas que se pueden mostrar están las siguientes:

  • USER: usuario propietario del proceso.
  • PID: identificador del proceso.
  • PPID: identificador del padre del proceso.
  • UID: identificador del usario dueño del proceso.
  • TTY: terminal en el que se está ejecutando el proceso.
  • TIME: tiempo de CPU utilizado, tiempo durante el cual el proceso ha estado activo.
  • CMD: nombre del programa que inicio el proceso.
  • NI: prioridad del proceso.
  • %CPU: porcentaje de CPU que está utilizando el proceso.
  • STAT: estado del proceso
Estados de los proceso extraídos del manual de ps
PROCESS STATE CODES
       Here are the different values that the s, stat and state output specifiers
       (header "STAT" or "S") will display to describe the state of a process:
       D    uninterruptible sleep (usually IO)
       R    running or runnable (on run queue)
       S    interruptible sleep (waiting for an event to complete)
       T    stopped, either by a job control signal or because it is being
            traced.
       W    paging (not valid since the 2.6.xx kernel)
       X    dead (should never be seen)
       Z    defunct ("zombie") process, terminated but not reaped by its parent.

       For BSD formats and when the stat keyword is used, additional characters
       may be displayed:
       <    high-priority (not nice to other users)
       N    low-priority (nice to other users)
       L    has pages locked into memory (for real-time and custom IO)
       s    is a session leader
       l    is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
       +    is in the foreground process group.

Sintaxis

ps [opciones]

Opciones

  • -A - Para ver, de todos los procesos las columnas PID, TTY, TIME y CMD
  • -ely - Estas opciones se usan unidas para ver de todos los procesos columnas como PID, PPID, TIME, CMD, NI, …
  • aux - Las opciones van sin guión. Muestra todos los procesos. Muestra, entre otras, las columnas USER, PID, TTY, STAT, TIME, %CPU, …
  • auxf - Muestra las columnas de la opción aux en forma de árbol.

Muestra los procesos en forma de arbol

Sintaxis

pstree [opciones]

Opciones

  • -u: muestra el propietario de los procesos

& Se utiliza para ejecutar procesos en segundo plano (background), con lo cual, la terminal queda libre para seguir realizando otras tareas.

Sintaxis

comando &

Se utilizan para ejecutar procesos con diferente prioridad a la aplicada por defecto o bien para cambiar la prioridad una vez que está en ejecución respectivamente.

Sintaxis

nice [opciones] comando

renice prioridad_nueva PID

Opciones

  • -n número - Ejecuta el comando con la prioridad que se indica en número
La prioridad que se puede asignar a un proceso con el comando nice puede ser de -20 (máxima prioridad) a 19 (mínima prioridad).

Esta prioridad se ve en la columna NI del comando ps. Después, el sistema dependiendo de ese valor, calcula la prioridad real del proceso, que puede tener otros valores y que se puede comprobar en la columna PRI del comando ps

Muestra los procesos asociados a un terminal. Tanto los que están ejecutándose en segundo plano, como los que están suspendidos.

Para suspender un proceso se usa la combinación de teclas CTRL + Z

Cada proceso del terminal suspendido o en segundo plano se identifica por un número. A partir de este número podemos posteriormente reanudarlo o pasarlo a primer plano.

Sintaxis

jobs

Ejemplo

Ejecutamos en un terminal gedit en segundo plano. Con jobs comprobamos su numero de trabajo y el estado en el que está.

$ gedit &
[1] 3558
$ jobs
[1]+  Ejecutando              gedit &

Ejecutamos en el terminal un proceso (gedit) y lo interrumpimos con CTRL + Z, con jobs comprobamos su estado y su número identificativo.

$ gedit
^Z
[1]+  Detenido                gedit
 
$ jobs
[1]+  Detenido                gedit

De los procesos que se están ejecutando en el terminal en segundo plano, bien ejecutándose o bien suspendidos, se envía a ejecutarse en primer plano el proceso que se le indique (si estaba suspendido lo reanuda)

sintaxis

fg n

Donde n es el número que ocupa el proceso en la lista de procesos que nos muestra jobs. si no se especifica ninguno, se manda a primer plano el marcado con un caracter “+” al ejecutar jobs.

Ejemplo

Se lanzan dos procesos en segundo plano, se comprueba con jobs los números de proceso y se envía a primer plano el marcado con un +:

$ nano &
[1] 3599
 
$ gedit &
[2] 3600
 
[1]+  Detenido                nano
 
$ jobs
[1]+  Detenido                nano
[2]-  Ejecutando              gedit &
 
$ fg
nano

De los procesos que se encuentran en segundo plano parados, se envía a segundo plano en ejecución el que se le indique:

Sintaxis

bg n

Donde n es el número que ocupa el proceso en la lista de procesos que nos muestra jobs.

Ejemplo

Ejecutamos gedit, lo interrumpimos (pasa a segundo plano en estado detenido), con jobs mostramos su estado. A continuación con bg lo pasamos a segundo plano en ejecución.

$ gedit
^Z
[1]+  Detenido                gedit
 
$ jobs
[1]+  Detenido                gedit
 
$ bg 1
[1]+ gedit &
 
$ jobs
[1]+  Ejecutando              gedit &

Permite enviar señales a un proceso

Sintaxis

kill [opciones] PID

Opciones

  • -9 - Mata un proceso cuyo PID le enviemos como argumento
  • -15 - Termina un proceso de forma ordenada.
  • -20 - Detiene la ejecución de un proceso
  • -l - Muestra todas las señales que se le pueden enviar a un proceso.
  • %n - Usa para identificar un proceso su número de trabajo en el terminal en lugar de su PID

Ejemplos

Ejecutamos un proceso, localizamos su PID y lo matamos:

$ gedit &
[1] 3647
$ ps a | grep gedit
 3647 pts/0    Sl     0:00 gedit
 3653 pts/0    S+     0:00 grep --color=auto gedit
 
$ kill -9 3647

Terminamos un proceso por su número de trabajo en lugar de por su PID (el número de señal para detener un proceso es 15)

$ nano &
[1] 3676
 
$ kill -15 %1

Interrumpimos un proceso por su número de trabajo en lugar de por su PID (el número de señal para detener un proceso es 15). Finalmente reanudamos el proceso por su número de trabajo.

$ gedit &
[1] 3676
 
$ kill -20 %1
 
$ fg 1

Mata todos los procesos asociados al progrma que le indiquemos.

Sintaxis

killall [opcioones] nombre_proceso

Opciones

  • -KILL - Mata el proceso cuyo nombre le indiquemos como argumento.
  • -i - Pide confirmación antes de eliminar cada proceso.
  • -l - Muestra todas las señales que se le pueden enviar a un proceso,

Ejemplo

ejecutamos dos programas y los eliminamos, pidiendo confirmación, a partir del nombre del programa:

$ nano &
 
$ nano &
 
$ killall -i nano
Matar nano(3683) ? (y/N) y
Matar nano(3684) ? (y/N) y

Ejecuta un comando y, al terminar, muestra información sobre el tiempo que ha tardado en ejecutarse. Los parámetros que se muestran son:

  • real - Muestra el tiempo de ejecución del comando
  • user - Muestra el tiempo empleado por la CPU en modo usuario.
  • sys - Muestra el tiempo empleado por la CPU en modo kernel.

Sintaxis

time comando

Ejemplo

Ver el tiempo empleado en listar todas los archivos, carpetas y subcarpetas de la carpeta home del usuario:

$ time ls -R /var
...
real	0m0.445s
user	0m0.052s
sys	0m0.064s

Muestra información de los procesos actualizada cada cierto tiempo (3 segundos por defecto)

Sintaxis

top

Ejemplo

$ top
 
top - 05:16:10 up  1:30,  3 users,  load average: 0.02, 0.04, 0.05
Tasks: 194 total,   2 running, 192 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.2%us,  0.4%sy,  0.0%ni, 99.4%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4126728k total,  2384316k used,  1742412k free,   164232k buffers
Swap:  4191228k total,        0k used,  4191228k free,  1477240k cached
 
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND            
 2414 usuario   20   0  684m 247m  35m S    2  6.1   5:53.89 firefox            
 1429 root      20   0  131m  66m 8804 S    2  1.7   3:08.22 Xorg               
 2450 usuario   20   0 87524 4008 2624 S    1  0.1   0:47.74 conky              
 2485 usuario   20   0  258m  36m  19m S    1  0.9  12:45.22 plugin-containe    
 3498 usuario   20   0  137m  16m  11m S    0  0.4   0:04.01 gnome-terminal     
    1 root      20   0  3404 1904 1264 S    0  0.0   0:01.23 init               
    2 root      20   0     0    0    0 S    0  0.0   0:00.00 kthreadd           
    3 root      20   0     0    0    0 S    0  0.0   0:00.32 ksoftirqd/0        
    6 root      RT   0     0    0    0 S    0  0.0   0:00.00 migration/0        
    7 root      RT   0     0    0    0 S    0  0.0   0:00.00 migration/1        
    9 root      20   0     0    0    0 S    0  0.0   0:00.05 ksoftirqd/1        
   10 root      20   0     0    0    0 S    0  0.0   0:02.54 kworker/0:1        
   11 root      RT   0     0    0    0 S    0  0.0   0:00.00 migration/2        
   12 root      20   0     0    0    0 S    0  0.0   0:00.65 kworker/2:0        
   13 root      20   0     0    0    0 S    0  0.0   0:00.03 ksoftirqd/2