-->

Señales de Procesos (KILL), Trabajos en Segundo Plano y Redirección de Salidas

Objetivo:

Comprender la naturaleza de las señales en Linux como mecanismo de comunicación y control de procesos, dominar el uso de kill (señales SIGTERM -15 y SIGKILL -9), aprender a listar señales del sistema (kill -l y man 7 signal), y ejercitar la gestión de trabajos en segundo plano (background con &, jobs, fg) combinada con la redirección de flujos estándar (stdout y stderr) para evitar interferencias en la consola.

Escenario:

  • Herramientas: Terminal de Linux en entorno gráfico o servidor.
  • Conceptos clave: Señales POSIX (SIGTERM vs. SIGKILL), identificadores de trabajos (Job IDs vs. PIDs), ejecución en segundo plano (&), recuperación a primer plano (fg), redirección de salida estándar (1>) y canal de errores (2>).

Instrucciones:

Fase 1: Inspección de señales del sistema y documentación

  • Abre la terminal de Linux.
  • Lista todas las señales disponibles en el sistema con sus correspondientes códigos numéricos y nombres técnicos:
  • kill -l
  • Identifica en la lista las señales SIGTERM (15) y SIGKILL (9).
  • Consulta la sección 7 del manual para ver la descripción técnica y la tabla de señales estándar de Linux:
  • man 7 signal
  • Navega por el documento usando las flechas o la tecla Espacio y sal presionando q.

Fase 2: Interrupción terminada (SIGTERM / -15) vs. Interrupción forzada (SIGKILL / -9)

  • Abre una segunda pestaña o ventana de terminal.
  • Inicia un proceso sleep en segundo plano durante 1000 segundos:
  • sleep 1000
  • Vuelve a la primera pestaña de la terminal y busca el PID de dicho proceso:
  • ps -ef | grep sleep
  • Envía una señal de terminación ordenada (SIGTERM / 15) especificando su PID (por ejemplo, 6759):
  • kill -15 [TU_PID_SLEEP]
  • Comprueba en la segunda pestaña que el proceso ha finalizado mostrando el mensaje Terminated o Terminado.
  • Vuelve a lanzar un nuevo comando sleep 1000 en la segunda pestaña.
  • Obtén el nuevo PID desde la primera pestaña mediante ps -ef | grep sleep.
  • Envía esta vez una señal de finalización inmediata/incondicional (SIGKILL / 9):
  • kill -9 [TU_PID_NUEVO_SLEEP]
  • Observa la diferencia en la segunda pestaña: el proceso es destruido de forma abrupta por el kernel (mostrando Killed o Killed / Eliminado) sin permitirle ejecutar rutinas de cierre.

Fase 3: Gestión de trabajos en segundo plano (&), listado (jobs) y primer plano (fg)

  • Lanza directamente un comando en segundo plano añadiendo el operador ampersand (&) al final:
  • sleep 1000 &
  • Observa el mensaje devuelto por la consola entre corchetes [1] 6815, donde el primer número es el Job ID y el segundo es el PID del proceso.
  • Lanza un segundo proceso en segundo plano:
  • sleep 500 &
  • Consulta el listado de tareas en segundo plano gestionadas desde tu sesión actual:
  • jobs
  • Muestra el listado de trabajos añadiendo sus PIDs correspondientes mediante el parámetro -l:
  • jobs -l
  • Mata el segundo trabajo utilizando su PID indicado en jobs -l mediante kill -9 [PID].
  • Trae el trabajo número 1 de vuelta al primer plano (foreground) indicando su Job ID:
  • fg %1
  • Comprueba que la consola queda bloqueada por el proceso. Cancela su ejecución presionando la combinación de teclas Ctrl + C.

Fase 4: Ejecución silenciosa en segundo plano mediante redirección de flujos (stdout y stderr)

  • Lanza un comando pesado de análisis de disco (du -am /) en segundo plano redirigiendo únicamente su salida estándar a un archivo temporal:
  • du -am / > /tmp/tan_disco.txt &
  • Observa cómo los mensajes de error de acceso denegado (Permission denied) continúan imprimiéndose en la consola e interrumpiendo tu trabajo.
  • Cancela la salida visual abriendo otra terminal o esperando a que termine.
  • Ejecuta correctamente el comando en segundo plano redirigiendo tanto la salida estándar (1> o >) como la salida de errores (2>) a ficheros independientes en /tmp:
  • du -am / > /tmp/tan_disco.txt 2> /tmp/errores.txt &
  • Verifica que la consola queda completamente limpia e interactiva mientras el trabajo se ejecuta limpiamente en segundo plano.
  • Comprueba periódicamente si el trabajo sigue activo con jobs o examina la creación y tamaño de los archivos generados:
  • ls -ltr /tmp/*.txt

Preguntas de reflexión:

  1. ¿Qué comando se utiliza para listar todas las señales del sistema con sus nombres numéricos y simbólicos?
  2. ¿Cuál es la diferencia fundamental entre enviar una señal SIGTERM (-15) y una señal SIGKILL (-9) a un proceso?
  3. ¿Por qué un proceso colgado o "congelado" puede ignorar una señal SIGTERM pero no una señal SIGKILL?
  4. ¿Qué función cumple el símbolo ampersand (&) al colocarse al final de un comando en la consola?
  5. ¿Qué diferencia existe entre el Job ID que muestra el comando jobs y el PID del sistema?
  6. ¿Cómo se vuelve a traer a primer plano (foreground) un proceso que se encuentra ejecutándose en segundo plano?
  7. ¿Por qué enviar un comando a segundo plano con & no evita que los mensajes o errores se impriman en pantalla si no se redirigen los flujos?
  8. ¿Qué representa el número 2 en la sintaxis de redirección 2> /tmp/errores.txt?
  9. ¿Se pueden visualizar desde una ventana de terminal los trabajos (jobs) lanzados en segundo plano desde otra ventana de terminal distinta? Explica por qué.
  10. ¿Qué combinación de teclas permite interrumpir/cancelar de manera inmediata el proceso que se está ejecutando en primer plano en la consola?
Haz clic aquí para ver las soluciones y explicaciones

1. ¿Qué comando se utiliza para listar todas las señales del sistema con sus nombres numéricos y simbólicos?

El comando kill -l. Muestra en pantalla el catálogo completo de señales disponibles en el sistema operativo con su código numérico y su nombre estándar (como SIGKILL, SIGTERM, SIGHUP, etc.).


2. ¿Cuál es la diferencia fundamental entre enviar una señal SIGTERM (-15) y una señal SIGKILL (-9) a un proceso?

SIGTERM (15) le pide amablemente al programa que termine, permitiéndole interceptar la señal, cerrar archivos, liberar recursos y finalizar de forma ordenada. SIGKILL (9) no puede ser capturada ni ignorada por el programa; el propio kernel de Linux destruye el proceso de forma inmediata y abrupta.


3. ¿Por qué un proceso colgado o "congelado" puede ignorar una señal SIGTERM pero no una señal SIGKILL?

Porque SIGTERM es manejada por el propio código de la aplicación. Si la aplicación está bloqueada o en un bucle infinito, no procesará la señal. Por el contrario, SIGKILL es ejecutada directamente por el kernel del sistema operativo, saltándose el código del proceso.


4. ¿Qué función cumple el símbolo ampersand (&) al colocarse al final de un comando en la consola?

Indica al shell que debe ejecutar esa orden en segundo plano (background), devolviendo inmediatamente el control de la línea de comandos al usuario para que pueda seguir introduciendo otros comandos.


5. ¿Qué diferencia existe entre el Job ID que muestra el comando jobs y el PID del sistema?

El Job ID es un número secuencial pequeño (ej. 1, 2) asignado localmente por la sesión de shell actual para gestionar sus procesos de fondo. El PID es el identificador único global del proceso asignado por el kernel en todo el sistema operativo.


6. ¿Cómo se vuelve a traer a primer plano (foreground) un proceso que se encuentra ejecutándose en segundo plano?

Mediante el comando fg %N (donde N es el número de Job ID, o simplemente fg para recuperar el último trabajo enviado a fondo).


7. ¿Por qué enviar un comando a segundo plano con & no evita que los mensajes o errores se impriman en pantalla si no se redirigen los flujos?

Porque el operador & únicamente desvincula el control del teclado (entrada estándar), pero los canales de salida estándar (stdout) y salida de errores (stderr) siguen conectados a la pantalla de la terminal a menos que se redirijan a un archivo con > y 2>.


8. ¿Qué representa el número 2 en la sintaxis de redirección 2> /tmp/errores.txt?

Representa el descriptor de archivo (file descriptor) de la salida de error estándar (stderr). Al usar 2>, indicamos que solo las alertas y mensajes de error producidos por el comando se dirijan hacia ese fichero.


9. ¿Se pueden visualizar desde una ventana de terminal los trabajos (jobs) lanzados en segundo plano desde otra ventana de terminal distinta? Explica por qué.

No. El comando jobs es exclusivo de la sesión del shell activa en esa terminal concreta. Para consultar procesos lanzados desde otras terminales o usuarios es necesario emplear herramientas globales del sistema como ps o top.


10. ¿Qué combinación de teclas permite interrumpir/cancelar de manera inmediata el proceso que se está ejecutando en primer plano en la consola?

La combinación de teclas Ctrl + C, la cual envía internamente la señal SIGINT (Signal Interrupt) al proceso activo en primer plano.


Ficha de Laboratorio: Señales de Procesos (KILL), Trabajos en Segundo Plano y Redirección de Salidas

Instrucciones de entrega:

  1. Rellena los campos y responde en este formulario desde tu navegador.
  2. Pulsa el botón de imprimir al final de la página.
  3. Selecciona "Guardar como PDF" en el diálogo de impresión.
  4. Entrega el archivo PDF en el aula virtual.

Alumno/a:      Fecha:      

Grupo:


Completa la ficha realizando las siguientes actividades:

  1. Identificación de señales y uso de kill -15 vs kill -9.
    Lanza un proceso sleep 1000 y escribe el comando usado para finalizarlo de forma limpia (SIGTERM) y forzada (SIGKILL):

    Copia la respuesta del terminal al finalizar el proceso en ambos casos:

    Explica la diferencia entre usar la señal -15 y la señal -9:
  2. Ejecución de procesos en segundo plano con &.
    Escribe la orden para lanzar un proceso sleep 500 directamente en segundo plano:

    Copia la confirmación con el Job ID y el PID que imprime la consola:

    Explica qué ventaja ofrece ejecutar comandos finalizados con &:
  3. Control e inspección de trabajos con jobs y fg.
    Escribe la orden para listar los trabajos activos y la orden para recuperar el trabajo %1 a primer plano:

    Copia la salida devuelta por el comando jobs -l:

    Explica la función de la orden fg:
  4. Redirección de la salida de error (2>) en segundo plano.
    Escribe el comando para ejecutar du -am / enviando los datos a un archivo y los errores a otro en segundo plano:

    Escribe la orden para verificar la creación de ambos archivos resultantes en /tmp:

    Explica por qué es fundamental redirigir 2> al trabajar con procesos en segundo plano:
  5. Interrupción de tareas en primer plano (Ctrl + C).
    Indica la combinación de teclado empleada para detener un comando que bloquea la terminal:

    Indica qué señal interna envía el sistema al presionar dicha combinación:

    Explica por qué Ctrl + C no afecta a los trabajos que corren en segundo plano: