Anterior | Contenido | Siguiente
En la lección anterior, vimos algunas de las implicaciones de que Linux sea un sistema operativo multiusuario. En esta lección, examinaremos la naturaleza multitarea de Linux, y cómo se controla con la interfaz de línea de comandos.
Como con cualquier sistema operativo multitarea, Linux ejecuta múltiples procesos simultáneos. Bueno, al menos parecen simultáneos. En realidad, un solo núcleo de procesador sólo puede ejecutar un proceso a la vez, pero el núcleo de Linux se las arregla para dar a cada proceso su turno en el procesador y cada uno parece estar funcionando al mismo tiempo.
Hay varios comandos que se utilizan para controlar los procesos. Son:
-
ps
– listar los procesos que se ejecutan en el sistema -
kill
– enviar una señal a uno o más procesos (normalmente para «matar» un proceso) -
jobs
– una forma alternativa de listar sus propios procesos -
bg
– poner un proceso en segundo plano -
fg
– poner un proceso en primer plano
Un ejemplo práctico
Aunque pueda parecer que este tema es bastante oscuro, puede ser muypráctico para el usuario medio que trabaja principalmente con la interfaz gráfica de usuario. Aunque no sea evidente, la mayoría de los programas gráficos (si no todos) pueden lanzarse desde la línea de comandos. He aquí un ejemplo: hay un pequeño programa suministrado con el sistema X Window llamado xload que muestra un gráfico que representa la carga del sistema. Podemos ejecutar este programa escribiendo lo siguiente:
xload
Nota que la pequeña ventana xload
aparece y comienza a mostrar el gráfico de carga del sistema. En los sistemas en los que xload
no está disponible, pruebe con gedit
en su lugar. Observe también que nuestro prompt no volvió a aparecer después de que se lanzara el programa. El shell está esperando a que el programa termine antes de devolver el control. Si cerramos la ventana xload
, el programa xload termina y el prompt vuelve a aparecer.
Poner un programa en segundo plano
Ahora, para facilitarnos la vida, vamos a lanzar de nuevo el programa xload, pero esta vez lo pondremos en segundo plano para que el prompt vuelva a aparecer. Para ello, ejecutamos xload así:
xload &
1223$En este caso, el prompt ha vuelto porque el proceso se ha puesto en segundo plano.
Ahora imaginemos que se nos ha olvidado utilizar el símbolo «&» para poner el programa en segundo plano. Todavía hay esperanza. Podemos escribir Ctrl-z
y el proceso se suspenderá. Podemos comprobarlo viendo que la ventana del programa se congela. El proceso sigue existiendo, pero está inactivo. Para reanudar el proceso en segundo plano, escriba el comando bg
(abreviatura de background). Este es un ejemplo:
xload
+ Stopped xload$ bg
+ xload &Lista de procesos en ejecución
Ahora que tenemos un proceso en segundo plano, sería útil mostrar una lista de los procesos que hemos lanzado. Para ello, podemos utilizar el comandojobs
o el más potente comando ps.
jobs
+ Ejecutando xload&$ ps
PID TTY TIME CMD1211 pts/4 00:00:00 bash1246 pts/4 00:00:00 xload1247 pts/4 00:00:00 ps$Matar un proceso
Supongamos que tenemos un programa que deja de responder; ¿cómo lo eliminamos? Usamos el comando kill
, por supuesto. Vamos a probar esto en xload
. Primero, necesitamos identificar el proceso que queremos matar. Para ello, podemos utilizar jobs
ops
. Si usamos jobs obtendremos un número de job. Con ps
, se nos da un id de proceso (PID). Lo haremos bothways:
xload &
1292$ jobs
+ Running xload&$ kill %1
$ xload &
1293 Terminated xload$ ps
PID TTY TIME CMD1280 pts/5 00:00:00 bash1293 pts/5 00:00:00 xload1294 pts/5 00:00:00 ps$ kill 1293
+ Terminado xload$Un poco más sobre kill
Aunque el comando kill
se utiliza para «matar» procesos, su verdadero propósito es enviar señales a los procesos. La mayoría de las veces la señal está destinada a decirle al proceso que se vaya, pero hay algo más que eso. Los programas (si están bien escritos) escuchan las señales del sistema operativo y responden a ellas, la mayoría de las veces para permitir un método de terminación más racional. Por ejemplo, un editor de texto podría escuchar cualquier señal que indique que el usuario está cerrando la sesión, o que el ordenador se está apagando. Cuando recibe esta señal, podría guardar el trabajo en curso antes de salir. El comando kill
puede enviar una variedad de señales a los procesos. Escribiendo:
kill -l
se imprimirá una lista de las señales que admite. Muchas son bastante oscuras, pero varias son útiles para conocer:
Señal # | Nombre | Descripción |
1 | SIGHUP | Señal de colgar. Los programas pueden escuchar esta señal y actuar sobre ella. Esta señal se envía a los procesos que se ejecutan en un terminal cuando se cierra el terminal. |
2 | SIGINT | Señal de interrupción. Esta señal se da a los procesos para interrumpirlos. Los programas pueden procesar esta señal y actuar sobre ella. También podemos emitir esta señal directamente escribiendo Ctrl-c en la ventana de la terminal donde se está ejecutando el programa. |
15 | SIGTERM | Señal de terminación. Esta señal se da a los procesos para terminarlos. De nuevo, los programas pueden procesar esta señal y actuar sobre ella. Esta es la señal por defecto enviada por el comando kill si no se especifica ninguna señal. |
9 | SIGKILL | Señal de terminación. Esta señal provoca la terminación inmediata del proceso por parte del kernel de Linux. Los programas no pueden escuchar esta señal. |
Ahora supongamos que tenemos un programa que se cuelga sin remedio y queremos deshacernos de él. Esto es lo que hacemos:
- Utiliza el comando
ps
para obtener el id de proceso (PID) del proceso que queremos terminar. - Emite un comando
kill
para ese PID. - Si el proceso se niega a terminar (es decir, Si el proceso se niega a terminar (es decir, ignora la señal), envíe señales cada vez más fuertes hasta que termine.
ps x | grep bad_program
PID TTY STAT TIME COMMAND2931 pts/5 SN 0:00 bad_program$ kill -SIGTERM 2931
$ kill -SIGKILL 2931
En el ejemplo anterior utilizamos el comando ps
con la opción x para listar todos nuestros procesos (incluso los que no se lanzaron desde la terminal actual). Además, canalizamos la salida del comando ps en grep
para listar sólo el programa que nos interesa. A continuación, utilizamos kill para emitir una señal SIGTERM al programa problemático.En la práctica, es más común hacerlo de la siguiente manera ya que la señal por defecto enviada por kill
es SIGTERM y kill también puede utilizar el número de la señal en lugar del nombre de la señal:
kill 2931
Entonces, si el proceso no termina, forzarlo con la señal SIGKILL:
kill -9 2931
¡Eso es!
Con esto concluye la serie de lecciones «Aprendiendo el Shell». En la próxima serie, «Escribiendo scripts de la Shell», veremos cómo automatizar tareas con la Shell.
Lectura adicional
- Para un tratamiento más profundo del tema, vea el capítulo 10 de La línea de comandos de Linux.
- 1963 Timesharing: A Solution to Computer Bottlenecks, un fascinante vídeo de YouTube del Computer History Museum que describe el primer sistema operativo de tiempo compartido y su funcionamiento. Es básicamente el mismo método utilizado por todos los ordenadores modernos.