Cómo ejecutar y controlar procesos en segundo plano en Linux

  • Dave McKay

    @TheGurkha

  • 24 de septiembre de 2019, 8:00am EDT
Fatmawati Achmad Zaenuri/.com

Use el Shell bash en Linux para administrar procesos en primer plano y en segundo plano. Puede usar las funciones y señales de control de trabajo de Bash para darle más flexibilidad en la forma de ejecutar comandos. Te mostramos cómo.

All About Processes

cada vez que se ejecuta un programa en un sistema operativo Linux o Unix, se inicia un proceso., «Proceso» es el nombre de la representación interna del programa ejecutante en la memoria del ordenador. Hay un proceso para cada programa activo. De hecho, hay un proceso para casi todo lo que se está ejecutando en su computadora. Esto incluye los componentes de su entorno gráfico de escritorio (GDE) como GNOME o KDE, y los demonios del sistema que se lanzan al inicio.

¿Por qué casi todo lo que está funcionando? Bueno, Bash built-ins como cd, pwd y alias no necesitan tener un proceso iniciado (o «generado») cuando se ejecutan., Bash ejecuta estos comandos dentro de la instancia del shell Bash que se está ejecutando en su ventana de terminal. Estos comandos son rápidos precisamente porque no necesitan tener un proceso iniciado para que se ejecuten. (Puede escribir help en una ventana de terminal para ver la lista de built-ins de Bash.)

Advertisement

los procesos se pueden ejecutar en primer plano, en cuyo caso se hacen cargo de su terminal hasta que se hayan completado, o se pueden ejecutar en segundo plano., Los procesos que se ejecutan en segundo plano no dominan la ventana del terminal y puede continuar trabajando en ella. O al menos, no dominan la ventana del terminal si no generan salida de pantalla.

un ejemplo desordenado

vamos a iniciar un simple ping trace running. Vamos a ping el dominio Geek de instrucciones. Esto se ejecutará como un proceso en primer plano.

ping www.howtogeek.com

obtenemos los resultados esperados, desplazándonos por la ventana del terminal. No podemos hacer nada más en la ventana del terminal mientras ping se está ejecutando., Para terminar el comando pulse Ctrl+C.

Ctrl+C

El efecto visible del Ctrl+C se resalta en la captura de pantalla. ping da un breve resumen y luego se detiene.

Advertisement

vamos a repetir eso. Pero esta vez vamos a golpear Ctrl+Z en lugar de Ctrl+C. La tarea no será terminada. Se convertirá en una tarea de fondo. Recuperamos el control de la ventana de la terminal.,

ping www.howtogeek.com
Ctrl+Z

El efecto visible de golpear Ctrl+Z es resaltado en la captura de pantalla.

esta vez se nos dice que el proceso se detiene. Detenido no significa terminado. Es como un auto en una señal de stop. No lo hemos desechado y tirado. Todavía está en la carretera, inmóvil, esperando para irse. El proceso es ahora un trabajo en segundo plano.

el comando jobs mostrará una lista de los trabajos que se han iniciado en la sesión de terminal actual., Y como los trabajos son (inevitablemente) procesos, también podemos usar el comando ps para verlos. Usemos ambos comandos y comparemos sus salidas. Usaremos la opción T opción (terminal) para enumerar solo los procesos que se están ejecutando en esta ventana de terminal. Tenga en cuenta que no es necesario utilizar un guion - con la opción T.

jobs
ps T

El jobs comando nos dice:

  • : El número entre corchetes es el número de trabajo., Podemos usar esto para referirnos al trabajo Cuando necesitamos controlarlo con comandos de control de trabajo.
  • +: El signo más + muestra que este es el trabajo sobre el que se actuará si usamos un comando de control de trabajo sin un número de trabajo específico. Se llama el trabajo predeterminado. El trabajo predeterminado es siempre el que se ha añadido más recientemente a la lista de trabajos.
  • detenido: el proceso no se está ejecutando.
  • ping www.howtogeek.com: la línea de comandos que lanzó el proceso.,

el comando ps nos dice:

  • PID: el ID del proceso. Cada proceso tiene un ID único.
  • TTY: el pseudo-teletipo (ventana terminal) desde el que se ejecutó el proceso.
  • STAT: El estado del proceso.
  • tiempo: la cantidad de tiempo de CPU consumido por el proceso.
  • comando: el comando que lanzó el proceso.

estos son valores comunes para la columna STAT:

  • D: sueño ininterrumpido. El proceso está en un estado de espera, Generalmente esperando entrada o salida, y no se puede interrumpir.,
  • I: Inactivo.
  • R: en ejecución.
  • s: sueño interrumpible.
  • T: detenido por una señal de control de trabajo.
  • Z: un proceso zombi. El proceso ha sido terminado pero no ha sido «limpiado» por su proceso padre.
Advertisement

el valor en la columna STAT puede ser seguido por uno de estos indicadores adicionales:

  • <: tarea de alta prioridad (no es agradable para otros procesos).
  • N: Baja prioridad (agradable para otros procesos).
  • L: el proceso tiene páginas bloqueadas en la memoria (típicamente usadas por procesos en tiempo real).,
  • s: un líder de sesión. Un líder de sesión es un proceso que ha lanzado grupos de procesos. Un shell es un líder de sesión.
  • l: proceso multihilo.
  • +: Un proceso en primer plano.

podemos ver que Bash tiene un estado de Ss. La » S » mayúscula nos dice que la Concha Bash está durmiendo, y es interrumpible. Tan pronto como lo necesitemos, responderá. La » s » minúscula nos dice que el shell es un líder de sesión.

El comando ping tiene un estado de T., Esto nos dice que ping ha sido detenido por una señal de control de trabajo. En este ejemplo, ese fue el Ctrl+Z que usamos para ponerlo en segundo plano.

el comando ps Ttiene un estado de R, que significa running. El + indica que este proceso es un miembro del grupo foreground. Así que el comando ps T se está ejecutando en primer plano.

el comando bg

el comando bg se utiliza para reanudar un proceso en segundo plano., Se puede utilizar con o sin número de trabajo. Si lo usa sin un número de trabajo, el trabajo predeterminado se pone en primer plano. El proceso todavía se ejecuta en segundo plano. No puede enviar ninguna entrada a ella.

Anuncio

Si hacemos el bg comando, vamos a reanudar nuestras ping comandos:

bg

El ping comando reanuda y vemos el desplazamiento de salida en la ventana de terminal una vez más. Se muestra el nombre del comando que se ha reiniciado., Esto está resaltado en la captura de pantalla.

Pero tenemos un problema. La tarea se está ejecutando en segundo plano y no aceptará entradas. Entonces, ¿cómo lo detenemos? Ctrl+C no hace nada. Podemos verlo cuando lo escribimos, pero la tarea en segundo plano no recibe esas pulsaciones de teclas, por lo que sigue haciendo ping alegremente.

Advertisement

de hecho, ahora estamos en un extraño modo mezclado. Podemos escribir en la ventana del terminal, pero lo que escribimos es rápidamente arrastrado por la salida de desplazamiento del comando ping. Cualquier cosa que escribamos tiene efecto en primer plano.,

para detener nuestra tarea en segundo plano necesitamos traerla al primer plano y luego detenerla.

el comando fg

el comando fg traerá una tarea en segundo plano al primer plano. Al igual que el comando bg, se puede usar con o sin un número de trabajo. Usarlo con un número de trabajo significa que funcionará en un trabajo específico. Si se usa sin un número de trabajo, se usa el último comando que se envió al fondo.

Si escribimos fg nuestro comando ping se llevará al primer plano., Los caracteres que escribimos se mezclan con la salida del comando ping, pero son operados por el shell como si se hubieran introducido en la línea de comandos como de costumbre. Y de hecho, desde el punto de vista de Bash shell, eso es exactamente lo que ha sucedido.

fg
Advertisement

y ahora que tenemos el comando ping ejecutándose en primer plano una vez más, podemos usar Ctrl+C para eliminarlo.

Ctrl+C

Necesitamos para Enviar las Señales correctas

Que no era precisamente bonita., Evidentemente, ejecutar un proceso en segundo plano funciona mejor cuando el proceso no produce salida y no requiere entrada.

pero, desordenado o no, nuestro ejemplo logró:

  • poner un proceso en segundo plano.
  • restaurar el proceso a un estado de ejecución en segundo plano.
  • devolver el proceso al primer plano.
  • terminar el proceso.

cuando utiliza Ctrl+Cy Ctrl+Z, está enviando señales al proceso. Estas son formas abreviadas de usar el comando kill., Hay 64 señales diferentes que kill puede enviar. Use kill -l en la línea de comandos para listarlos. kill no es la única fuente de estas señales. Algunos de ellos son generados automáticamente por otros procesos dentro del sistema

Aquí están algunos de los más utilizados.

  • SIGHUP: señal 1. Se envía automáticamente a un proceso cuando se cierra el terminal en el que se está ejecutando.
  • SIGINT: señal 2. Enviado a un proceso que pulsa Ctrl+C. El proceso se interrumpe y se le dice que termine.,
  • SIGQUIT: señal 3. Enviado a un proceso si el usuario envía una señal de salida Ctrl+D.
  • SIGKILL: señal 9. El proceso es inmediatamente asesinado y no intentará cerrar limpiamente. El proceso no desciende con gracia.
  • SIGTERM: señal 15. Esta es la señal predeterminada enviada por kill. Es la señal de terminación del programa estándar.
  • SIGTSTP: señal 20. Enviado a un proceso cuando se utiliza Ctrl+Z. Detiene el proceso y lo pone en segundo plano.,

debemos usar el comando kill para emitir señales que no tengan combinaciones de teclas asignadas.

control adicional del trabajo

un proceso movido al fondo usando Ctrl+Z se coloca en el estado detenido. Tenemos que usar el comando bg para iniciarlo de nuevo. Iniciar un programa como un proceso en segundo plano es simple. Añada un ampersand & al final de la línea de comandos.,

Advertisement

aunque es mejor que los procesos en segundo plano no escriban en la ventana del terminal, vamos a usar ejemplos que sí lo hagan. Necesitamos tener algo en las capturas de pantalla a lo que podamos referirnos. Este comando iniciará un bucle sin fin como un proceso en segundo plano:

while true; do echo «How-To Geek loop Process»; sleep 3; done &

se nos dice el número de trabajo y el ID de proceso del proceso. Nuestro número de trabajo es 1, y el id del proceso es 1979. Podemos usar estos identificadores para controlar el proceso.,

Advertisement

la salida de nuestro bucle sin fin comienza a aparecer en la ventana del terminal. Como antes, podemos usar la línea de comandos, pero cualquier comando que emitamos se intercala con la salida del proceso de bucle.

ls

para detener nuestro proceso podemos usar jobs para recordarnos Cuál es el número de trabajo, y luego usar kill.

jobs informa que nuestro proceso es el número de trabajo 1. Para usar ese número con kill debemos precederlo con un signo de porcentaje %.,

jobs
kill %1
kill envía el SIGTERM señal, señal número 15, para el proceso y que se terminó. Cuando se presiona la tecla Enter, se muestra el estado del trabajo. Enumera el proceso como «terminado.»Si el proceso no responde al comando kill puede llevarlo a un nivel superior. Utilice kill con SIGKILL, número de señal 9. Simplemente ponga el número 9 entre el comando kill el número de trabajo.,

kill 9 %1

cosas que hemos cubierto

  • Ctrl+C: envía SIGINT, señal 2, al proceso—si está aceptando entrada—y le dice que termine.
  • Ctrl + D: envía SISQUIT, señal 3, al proceso—si acepta entrada-y le dice que salga.
  • Ctrl+Z: envía SIGSTP, señal 20, al proceso y le dice que se detenga (suspenda) y se convierta en un proceso en segundo plano.
  • jobs: enumera los trabajos en segundo plano y muestra su número de trabajo.
  • BG job_number: reinicia un proceso en segundo plano., Si no proporciona un número de trabajo, se utiliza el último proceso que se convirtió en una tarea en segundo plano.
  • FG job_number: trae un proceso en segundo plano al primer plano y lo reinicia. Si no proporciona un número de trabajo, se utiliza el último proceso que se convirtió en una tarea en segundo plano.
  • commandline &: agregar un ampersand & al final de una línea de comandos ejecuta ese comando como una tarea en segundo plano, que se está ejecutando.
  • kill % job_number: envía SIGTERM, señal 15, al proceso para terminarlo.,
  • kill 9% job_number: envía SIGKILL, señal 9, al proceso y lo termina abruptamente.

RELACIONADO: Cómo matar procesos desde el terminal Linux

Dave McKay
Dave McKay usó computadoras por primera vez cuando la cinta de papel perforado estaba de moda, y ha estado programando desde entonces. Después de más de 30 años en la industria de ti, ahora es un periodista tecnológico a tiempo completo., Durante su carrera, ha trabajado como programador freelance, gerente de un equipo internacional de desarrollo de software, gerente de proyectos de servicios de ti y, más recientemente, como oficial de protección de datos. Dave es un evangelista de Linux y defensor del código abierto.Leer la Biografía Completa «

Leave a Comment