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

Contenidos

Un entorno de shell en una computadora Linux.

Utilice 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 trabajos de Bash para brindarle más flexibilidad en la forma en que ejecuta los comandos. Te mostramos cómo.

Todo sobre los procesos

Siempre que se ejecuta un programa en un sistema operativo Linux o semejante a Unix, se inicia un procedimiento. “Procedimiento” es el nombre de la representación interna del programa en ejecución en la memoria de la computadora. Hay un procedimiento para cada programa activo. En realidad, existe un procedimiento para casi todo lo que se ejecuta en su computadora. Eso incluye los componentes de su entorno de escritorio gráfico (GDE) como GNOMO o KDEy sistema demonios que se lanzan al inicio.

Por qué por poco todo lo que esta corriendo? Bueno, Bash incorporados como CD, pwd, y alias no es necesario tener un procedimiento iniciado (o «generado») cuando se ejecutan. Bash ejecuta estos comandos dentro de la instancia del shell Bash que se ejecuta en la ventana de su terminal. Estos comandos son rápidos exactamente debido a que no necesitan tener un procedimiento iniciado para que se ejecuten. (Puede escribir help en una ventana de terminal para ver la lista de funciones integradas de Bash).

Los procesos pueden ejecutarse en primer plano, en cuyo caso se apoderarán 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 de la terminal y puede continuar trabajando en ella. O al menos, no dominan la ventana de la terminal si no generan una salida de pantalla.

Un ejemplo desordenado

Comenzaremos un simple ping seguimiento en ejecución. Iremos a ping el dominio How-To Geek. Esto se ejecutará como un procedimiento en primer plano.

ping www.systempeaker.com

Obtenemos los resultados esperados, desplazándonos hacia abajo por la ventana del terminal. No podemos hacer nada más en la ventana de la terminal mientras ping Esta corriendo. Para terminar el comando, presione Ctrl+C.

Ctrl+C

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

Repitamos eso. Pero esta vez golpearemos Ctrl+Z en lugar de Ctrl+C. La tarea no se terminará. Se convertirá en una tarea en segundo plano. Obtenemos el control de la ventana de la terminal que se nos devuelve.

ping www.systempeaker.com
Ctrl+Z

El efecto visible de golpear Ctrl+Z se resalta en la captura de pantalla.

Esta vez se nos dice que el procedimiento se detiene. Detenido no significa terminado. Es como un coche en una señal de pare. No lo hemos desechado y tirado. Aún está en la carretera, parado, esperando para comenzar. El procedimiento es ahora un trasfondo trabajo.

los jobs mando enumerará los trabajos que se han iniciado en la sesión de terminal actual. Y dado que los trabajos son (inevitablemente) procesos, al mismo tiempo podemos utilizar la ps comando para verlos. Usemos ambos comandos y comparemos sus salidas. Usaremos el T opción (terminal) opción 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 el T opción.

jobs
ps T

los jobs comando nos dice:

  • [1]: 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 del 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 trabajo predeterminado. El trabajo predeterminado es siempre el que se agregó más recientemente a la lista de trabajos.
  • Interrumpido: El procedimiento no se está ejecutando.
  • ping www.systempeaker.com: La línea de comando que inició el procedimiento.

los ps comando nos dice:

  • PID: El ID de procedimiento del procedimiento. Cada procedimiento dispone de una identificación única.
  • TTY: El pseudo-teletipo (ventana de terminal) desde el que se ejecutó el procedimiento.
  • ESTADÍSTICA: El estado del procedimiento.
  • TIEMPO: La cantidad de tiempo de CPU consumido por el procedimiento.
  • MANDO: El comando que inició el procedimiento.

Estos son valores comunes para la columna STAT:

  • D: Sueño ininterrumpido. El procedimiento está en un estado de espera, de forma general esperando entrada o salida, y no se puede interrumpir.
  • I: Inactivo.
  • R: Corriendo.
  • S: Sueño interrumpible.
  • T: Detenido por una señal de control de trabajo.
  • Z: Un procedimiento zombi. El procedimiento ha acabado, pero su procedimiento principal no lo ha «limpiado».

El valor de la columna STAT puede ir seguido de uno de estos indicadores adicionales:

  • <: Tarea de alta prioridad (no es agradable para otros procesos).
  • norte: Prioridad baja (bueno para otros procesos).
  • L: el procedimiento tiene páginas bloqueadas en la memoria (regularmente utilizadas por procesos en tiempo real).
  • s: Líder de la sesión. Un líder de sesión es un procedimiento que ha lanzado grupos de procesos. Un caparazón es un líder de sesión.
  • l: Procedimiento multihilo.
  • +: Un procedimiento de primer plano.

Podemos ver que Bash tiene un estado de Ss. La “S” mayúscula nos dice que el shell 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 solíamos ponerlo en segundo plano.

los ps T el comando tiene un estado de R, que significa correr. los + indica que este procedimiento es miembro del grupo de primer plano. Entonces el ps T El comando se está ejecutando en primer plano.

El comando bg

los bg El comando se utiliza para reanudar un procedimiento en segundo plano. Se puede utilizar con o sin número de trabajo. Si lo utiliza sin un número de trabajo, el trabajo predeterminado pasa a primer plano. El procedimiento aún se ejecuta en segundo plano. No puede enviarle ninguna entrada.

Si emitimos el bg comando, reanudaremos nuestro ping mando:

bg

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

se reanudó el proceso de ping en segundo plano con salida en una viuda de terminal

Pero tenemos un estorbo. La tarea se está ejecutando en segundo plano y no acepta 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, por lo que sigue haciendo ping alegremente.

En realidad, ahora estamos en un extraño modo combinado. Podemos escribir en la ventana de terminal, pero lo que escribimos es rápidamente barrido por la salida de desplazamiento del ping mando. Todo lo que escribimos tiene efecto en el primer plano.

Para detener nuestra tarea en segundo plano, debemos ponerla en primer plano y después detenerla.

El comando fg

los fg El comando traerá una tarea en segundo plano al primer plano. Como el bg comando, se puede utilizar 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 utiliza sin un número de trabajo, se utiliza el último comando que se envió al fondo.

Si escribimos fg nuestro ping El comando pasará a primer plano. Los caracteres que escribimos están mezclados con la salida del ping comando, pero son operados por el shell como si hubieran sido ingresados ​​en la línea de comando como de costumbre. Y en realidad, desde el punto de vista del caparazón Bash, eso es exactamente lo que ha sucedido.

fg

Y ahora que tenemos el ping comando que se ejecuta en primer plano una vez más, podemos usar Ctrl+C para matarlo.

Ctrl+C

Necesitamos enviar las señales correctas

Eso no fue exactamente bonito. Evidentemente, ejecutar un procedimiento en segundo plano funciona mejor cuando el procedimiento no produce salida y no necesita entrada.

Pero, desordenado o no, nuestro ejemplo logró:

  • Poner un procedimiento en segundo plano.
  • Restaurar el procedimiento a un estado de ejecución en segundo plano.
  • Devolviendo el procedimiento al primer plano.
  • Terminando el procedimiento.

Cuando usas Ctrl+C y Ctrl+Z , está enviando señales al procedimiento. Estos son formas taquigráficas de usar el kill mando. Existen 64 señales diferentes ese kill puede enviar. Usar kill -l en la línea de comando 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.

Éstos son algunos de los más utilizados.

  • SIGHUP: Señal 1. Se envía automáticamente a un procedimiento cuando se cierra el terminal en el que se está ejecutando.
  • SIGINT: Señal 2. Enviado a un procedimiento que aciertas. Ctrl+C. El procedimiento se interrumpe y se le indica que finalice.
  • SIGQUIT: Señal 3. Enviado a un procedimiento si el usuario envía una señal para dejar de fumar Ctrl+D.
  • SIGKILL: Señal 9. El procedimiento se detiene inmediatamente y no intentará cerrarse limpiamente. El procedimiento no se desarrolla con gracia.
  • SIGTERM: Señal 15. Esta es la señal predeterminada enviada por kill. Es la señal de terminación de programa estándar.
  • SIGTSTP: Señal 20. Enviado a un procedimiento cuando utiliza Ctrl+Z. Detiene el procedimiento y lo pone en segundo plano.

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

Mayor control del trabajo

Un procedimiento pasó a segundo plano a través de el uso de Ctrl+Z se coloca en el estado detenido. Tenemos que usar el bg comando para que vuelva a funcionar. Iniciar un programa como un procedimiento en ejecución en segundo plano es sencillo. Agregar un ampersand & hasta el final de la línea de comando.

Aún cuando es mejor que los procesos en segundo plano no escriban en la ventana de la terminal, usaremos ejemplos que sí lo hacen. Necesitamos tener algo en las capturas de pantalla a lo que podamos hacer referencia. Este comando iniciará un ciclo sin fin como procedimiento en segundo plano:

mientras sea cierto; haga eco de «Cómo hacer el procedimiento de bucle geek»; dormir 3; hecho &

Se nos dice el número de trabajo y el ID de identificación de procedimiento del procedimiento. Nuestro número de trabajo es 1 y la identificación del procedimiento es 1979. Podemos usar estos identificadores para controlar el procedimiento.

La salida de nuestro bucle sin fin comienza a aparecer en la ventana de la terminal. Como antes, podemos usar la línea de comandos, pero todos los comandos que emitimos se intercalan con la salida del procedimiento de bucle.

ls

salida del proceso de bucle de fondo intercalado con la salida de otros comandos

Para detener nuestro procedimiento podemos usar jobs para recordarnos cuál es el número de trabajo y después usar kill.

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

jobs
kill %1

RELACIONADO: Cómo funcionan las señales de Linux: SIGINT, SIGTERM y SIGKILL

kill envía el SIGTERM señal, señal número 15, al procedimiento y se termina. La próxima vez que se presione la tecla Intro, se muestra el estado del trabajo. Enumera el procedimiento como «terminado». Si el procedimiento no responde a la kill comando puede llevarlo a un nivel superior. Usar kill con SIGKILL , señal número 9. Simplemente coloque el número 9 entre kill comando el número de trabajo.

kill 9 %1

Cosas que hemos cubierto

  • Ctrl + C: Envía SIGINT, señal 2, al procedimiento, si está aceptando entrada, y le dice que termine.
  • Ctrl + D: Envía SISQUIT, señal 3, al procedimiento — si está aceptando entrada — y le dice que salga.
  • Ctrl + Z: Envía SIGSTP, señal 20, al procedimiento y le dice que se detenga (suspenda) y se convierta en un procedimiento en segundo plano.
  • trabajos: Enumera los trabajos en segundo plano y muestra su número de trabajo.
  • bg Número de trabajo: Reinicia un procedimiento en segundo plano. Si no proporciona un número de trabajo, se utiliza el último procedimiento que se convirtió en una tarea en segundo plano.
  • fg Número de trabajo: trae un procedimiento en segundo plano al primer plano y lo reinicia. Si no proporciona un número de trabajo, se utiliza el último procedimiento que se convirtió en una tarea en segundo plano.
  • línea de comando Y: Agregar un ampersand & al final de una línea de comando ejecuta ese comando como una tarea en segundo plano, que se está ejecutando.
  • matar %Número de trabajo: Envía SIGTERM, señal 15, al procedimiento para finalizarlo.
  • matar 9 %Número de trabajo: Envía SIGKILL, señal 9, al procedimiento y lo termina abruptamente.

RELACIONADO: Cómo matar procesos desde la terminal de Linux

setTimeout(function(){
!function(f,b,e,v,n,t,s)
{if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};
if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version=’2.0′;
n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(t,s) } (window, document,’script’,
‘https://connect.facebook.net/en_US/fbevents.js’);
fbq(‘init’, ‘335401813750447’);
fbq(‘track’, ‘PageView’);
},3000);

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.