Gestión de procesos
Definición y entorno
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.
Estados de un proceso
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.
Ejecución de procesos en segundo plano
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.
Interrupción de procesos. Primer plano, segundo plano
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.
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
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
Usando &
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
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 &
Deteniedo programas en segundo plano
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
Desvinculando un proceso del terminal
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
Envío de señales a los procesos
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
Comandos
ps
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
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.
pstree
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 &
nice y renice
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
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
jobs
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
fg
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
bg
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 &
kill
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
killall
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
time
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
top
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