Control de trabajos (Unix)

Control de trabajos mediante un shell Unix

En Unix y sistemas operativos similares a Unix , el control de trabajos se refiere al control de trabajos por parte de un shell , especialmente de forma interactiva, donde un "trabajo" es la representación de un shell para un grupo de procesos . Las características básicas del control de trabajos son la suspensión, reanudación o finalización de todos los procesos en el grupo de trabajos/procesos; las características más avanzadas se pueden realizar enviando señales al trabajo. El control de trabajos es de particular interés en Unix debido a su multiprocesamiento , y debe distinguirse del control de trabajos en general, que se aplica con frecuencia a la ejecución secuencial ( procesamiento por lotes ).

Descripción general

Al utilizar sistemas operativos Unix o similares a Unix a través de una terminal (o emulador de terminal ), un usuario inicialmente solo tendrá un único proceso ejecutándose, su shell interactivo (puede o no ser un shell de inicio de sesión ). La mayoría de las tareas [a] (listado de directorios, edición de archivos, etc.) se pueden realizar fácilmente dejando que el programa tome el control de la terminal y devolviendo el control al shell cuando el programa sale; formalmente, adjuntando la entrada estándar y la salida estándar al shell, que lee o escribe desde la terminal, y capturando las señales enviadas desde el teclado, como la señal de terminación que resulta de presionar Control+ C.

Sin embargo, a veces el usuario deseará realizar una tarea mientras utiliza el terminal para otro propósito. Una tarea que se está ejecutando pero que no recibe información del terminal se dice que se está ejecutando "en segundo plano", mientras que la tarea única que recibe información del terminal está "en primer plano". El control de tareas es una función desarrollada para hacer esto posible, al permitir al usuario iniciar procesos en segundo plano, enviar procesos que ya se están ejecutando al segundo plano, traer procesos en segundo plano al primer plano y suspender o finalizar procesos.

El concepto de un trabajo asigna el concepto (de shell) de un único comando de shell al concepto (de sistema operativo) de los posibles numerosos procesos que implica el comando. Las tareas multiproceso surgen porque los procesos pueden crear procesos secundarios adicionales y un único comando de shell puede constar de una secuencia de múltiples procesos que se comunican. Por ejemplo, un comando para seleccionar líneas que contengan el texto "título", ordenarlas alfabéticamente y mostrar el resultado en un buscapersonas .

grep  title  algúnarchivo.txt | ordenar | menos    

Esto crea al menos tres procesos: uno para grep , uno para sort y uno para less . El control de tareas permite que el shell controle estos procesos relacionados como una sola entidad y, cuando un usuario emite la combinación de teclas adecuada (normalmente + ), se suspende todo el grupo de procesos.ControlZ

Los trabajos son administrados por el sistema operativo como un único grupo de procesos , y el trabajo es la representación interna del shell de dicho grupo. Esto se define en POSIX como: [1]

Un conjunto de procesos, que comprende una tubería de shell y todos los procesos que descienden de ella, que están todos en el mismo grupo de procesos.

Se puede hacer referencia a un trabajo mediante un identificador [b] llamado ID de trabajo de control de trabajo o simplementeID de trabajo , que es utilizado porlas funciones integradas del shellpara referirse al trabajo. Los ID de trabajo comienzan con el%carácter ;%nidentifica el trabajon, mientras que%%identifica el trabajo actual. Otros ID de trabajo son especificados porPOSIX.[2]En el uso informal, el número puede denominarse "número de trabajo" o "ID de trabajo", y la documentación de Bash se refiere al ID de trabajo (con el prefijo %) como laespecificación de trabajo.[3]

El control de trabajos y los identificadores de trabajos normalmente solo se utilizan en el uso interactivo, donde simplifican la referencia a grupos de procesos; en los scripts se utilizan en cambio PGID, ya que son más precisos y robustos, y de hecho el control de trabajos está deshabilitado de manera predeterminada en los scripts bash.

Historia

El control de tareas fue implementado por primera vez en el shell C por Jim Kulp, [4] entonces en IIASA en Austria, haciendo uso de características del núcleo BSD 4.1 . El KornShell , desarrollado en Bell Labs, lo adoptó y luego se incorporó a la versión SVR4 del shell Bourne , y existe en la mayoría de los shells Unix modernos.

Comandos

El estándar POSIX especifica dos comandos para reanudar trabajos suspendidos en segundo plano y en primer plano, respectivamente bg y fg . Estos comandos se modelaron a partir de los comandos de control de trabajos del shell Korn. [5]

Implementación

Normalmente, el shell mantiene una lista de trabajos en una tabla de trabajos . Recuerde que un trabajo corresponde a un grupo de procesos, que consta de todos los miembros de una tubería y sus descendientes. El jobscomando enumerará los trabajos en segundo plano existentes en la tabla de trabajos, junto con su número de trabajo y estado de trabajo (detenido o en ejecución). Cuando una sesión finaliza cuando el usuario cierra sesión (sale del shell, lo que finaliza el proceso líder de la sesión ), el proceso del shell envía SIGHUP a todos los trabajos y espera a que finalicen los grupos de procesos antes de finalizarse.

El disowncomando se puede utilizar para eliminar trabajos de la tabla de trabajos, de modo que cuando la sesión finaliza no se envía SIGHUP a los grupos de procesos hijos, ni el shell espera a que finalicen. De este modo, se convierten en procesos huérfanos y el sistema operativo puede terminarlos, aunque lo más frecuente es que se utilice de esta forma para que los procesos sean adoptados por init (el núcleo establece su proceso padre en init) y continúen ejecutándose como daemons . Las alternativas para evitar que se finalicen los trabajos incluyen nohup y el uso de un multiplexor de terminal .

Un trabajo que se está ejecutando en primer plano se puede detener escribiendo el carácter de suspensión ( Ctrl-Z ). Esto envía la señal de "parada de terminal" ( SIGTSTP ) al grupo de procesos. De manera predeterminada, SIGTSTP hace que los procesos que lo reciben se detengan y el control se devuelve al shell. Sin embargo, un proceso puede registrar un controlador de señal para SIGTSTP o ignorarlo. Un proceso también se puede pausar con la señal de "parada" ( SIGSTOP ), que no se puede capturar ni ignorar.

Un trabajo que se está ejecutando en primer plano se puede interrumpir escribiendo el carácter de interrupción ( Ctrl-C ). Esto envía la señal de "interrupción" ( SIGINT ), que, por defecto, termina el proceso, aunque se puede anular.

Un trabajo detenido se puede reanudar como un trabajo en segundo plano con el bg comando incorporado , o como un trabajo en primer plano con fg. En cualquier caso, el shell redirige la E/S de forma adecuada y envía la señal SIGCONT al proceso, lo que hace que el sistema operativo reanude su ejecución. En Bash , un programa se puede iniciar como un trabajo en segundo plano añadiendo un ampersand ( &) a la línea de comandos; su salida se dirige a la terminal (posiblemente intercalada con la salida de otros programas), pero no puede leer desde la entrada de la terminal.

Un proceso en segundo plano que intenta leer o escribir en su terminal de control recibe una señal SIGTTIN (para entrada) o SIGTTOU (para salida). Estas señales detienen el proceso de forma predeterminada, pero también pueden manejarse de otras formas. Los shells suelen anular la acción de detención predeterminada de SIGTTOU para que los procesos en segundo plano envíen su salida a la terminal de control de forma predeterminada.

En los shells compatibles con Bash, el killincorporado (no /bin/kill) puede señalar trabajos por ID de trabajo así como por ID de grupo de procesos – enviar una señal a un trabajo lo envía a todo el grupo de procesos, y los trabajos especificados por un ID de trabajo deben ser eliminados prefijando %. killpuede enviar cualquier señal a un trabajo; sin embargo, si la intención es librar al sistema de los procesos, las señales SIGKILL y SIGTERM (la predeterminada) son probablemente las más aplicables.

Véase también

Notas

  1. ^ Aquí "tarea" es un término no técnico para "alguna actividad", mientras que "proceso" y "trabajo" son términos técnicos.
  2. ^ Un ID de trabajo es una referencia abstracta del shell a un recurso (un grupo de procesos) administrado externamente por el sistema operativo, por lo tanto es un identificador.

Referencias

  1. ^ IEEE Std 1003.1-2001, Sección 3.201, Trabajo
  2. ^ IEEE Std 1003.1-2001, Sección 3.203, Control de trabajo Identificación del trabajo
  3. ^ 7.1 Conceptos básicos del control de trabajos
  4. ^ Prólogo de Bill Joy en Anderson, Gail; Paul Anderson (1986). The UNIX C Shell Field Guide . Prentice-Hall. pág. xvii. ISBN 0-13-937468-X.
  5. ^ bg  – Referencia de shell y utilidades, la especificación única de UNIX , versión 4 de The Open Group ; fg – Referencia de shell y utilidades, la especificación única de UNIX , versión 4 de The Open Group .

Lectura adicional

  • Marshall Kirk McKusick y George V. Neville-Neil (2004-08-02). "Gestión de procesos de FreeBSD: grupos de procesos y sesiones". El diseño y la implementación del sistema operativo FreeBSD. Addison Wesley. ISBN 0-201-70245-2.
  • "Control de trabajos", Manual de referencia de Bash
Obtenido de "https://es.wikipedia.org/w/index.php?title=Control_de_trabajos_(Unix)&oldid=1244811468"