Gestión de trabajos

La gestión de trabajos en sistemas operativos similares a UNIX es un conjunto de herramientas para manipular trabajos por lotes de shell de UNIX , en particular en modo interactivo, donde "trabajo" es una representación de shell para un grupo de procesos .

En su forma más simple, el control del trabajo consistirá en pausar, reanudar o finalizar la ejecución de un trabajo (es decir, todos los procesos en un grupo de procesos), pero también puede implicar el envío de otra señal al trabajo . A diferencia de la noción de un bloque de control de trabajos  ( utilizado para ejecuciones en serie en modo por lotes), el control de trabajos implica un conjunto de herramientas personalizado para trabajar con el modo por lotes desde herramientas interactivas.

Resumen

La mayoría de las tareas del usuario [1] cuando se ejecuta a través de un terminal (o emulador de terminal ) (navegar directorios, editar archivos, etc.) se manejan transfiriendo el control a los programas, devolviendo el control al shell cuando el programa sale a través de la entrada estándar y la salida estándar. al shell leyendo desde el terminal, o escribiendo en él y recibiendo señales enviadas desde el teclado, como Control+ C.

Sin embargo, a veces el usuario puede necesitar ejecutar una tarea usando la terminal para un propósito diferente: una tarea que se está ejecutando pero no acepta la entrada de la terminal se denomina trabajo en segundo plano, mientras que la única tarea que acepta la entrada de la terminal se denomina tarea de primer plano. Job Control es una herramienta diseñada para hacer esto posible, que permite al usuario iniciar procesos en segundo plano, enviar procesos en primer plano al segundo plano, traer un proceso en segundo plano al primer plano e iniciar y detener procesos ( suspender, reanudar, terminar ) . 

El concepto de "trabajo" asigna el concepto de un solo comando de shell al concepto de un sistema operativo, donde se pueden iniciar muchos procesos con un solo comando. Específicamente, una sola tarea puede constar de muchos procesos: un proceso determinado puede crear procesos secundarios adicionales, que a su vez pueden crear sus propios procesos secundarios, y así sucesivamente, y un solo comando de shell puede consistir en una canalización de muchos procesos relacionados. Son administrados por el sistema operativo como un solo grupo de procesos (todos los procesos en el grupo comparten el mismo PGID), y la representación interna del grupo de procesos de shell es un trabajo. Esto se define en POSIX como: [2]

Un conjunto de procesos, incluida la canalización de shell y cualquier proceso que dependa de ella, que son todos miembros del mismo grupo de procesos.

Por lo tanto, un grupo de procesos puede administrarse como un solo shell, un solo trabajo. El trabajo , a su vez, puede ser referenciado por el identificador [3] , el ID de proceso del control del trabajo es utilizado por el comando integrado del shell para hacer referencia al trabajo. Los ID de trabajo comienzan con %% ; %ndefine el trabajo nombrado n, mientras que %%define el actual. Otros ID de trabajo se definen en POSIX [4] . La documentación de Bash se refiere a (%-prefijado) como una especificación de trabajo [5] .

Los controles de trabajo y las identificaciones de trabajo generalmente se usan solo en uso interactivo, donde facilitan la referencia a grupos de procesos; Los PGID se usan a menudo en los scripts porque son más precisos y más robustos, y en realidad el control de procesos está deshabilitado de forma predeterminada en los scripts de Bash.

Ejemplo

El usuario puede manipular tareas dentro de una sesión dada usando comandos de shell integrados como jobs, fgo bg.

Una tarea en un diagrama es equivalente a un grupo de procesos. PPID es el ID del proceso padre. SID - identificador de sesión. TTY - terminal de control.

Historia

Jim Culp [6] implementó primero el control de trabajos en el shell Csh y luego en MIPSA en Austria, utilizando características del kernel 4.1 BSD , y se adoptó en el shell Korn (ksh) desarrollado por Bell Labs. Más tarde se incluyó en la versión SVR4 del shell Bourne (sh) y ha existido desde entonces en la mayoría de los shells Unix modernos.

Aplicación

El shell generalmente mantiene una lista de trabajos en la tabla de procesos. El comando de trabajos enumera los trabajos en segundo plano que existen en la tabla de procesos, junto con el número y el estado (detenido o en ejecución) de cada proceso. El comando disown se puede usar para eliminar trabajos de la tabla de procesos, convirtiéndolos de trabajos a demonios para que continúen ejecutándose incluso cuando el usuario cierra la sesión .

Un trabajo que se ejecuta "en primer plano" se puede detener ingresando caracteres ( Ctrl+ Z). Esto enviará una señal SIGTSTP al grupo de proceso. El valor predeterminado SIGTSTPordenará que los procesos apropiados se detengan y transfieran el control a un shell. Sin embargo, el proceso puede registrar el token de señal o ignorar el SIGTSTP. El proceso también puede ser pausado por una señal SIGSTOPque no puede ser capturada o ignorada.

Un trabajo detenido se puede reanudar como un trabajo en segundo plano con el comando bg shell o traerlo al primer plano con el comando fg . En cualquier caso, el shell redirige la E/S en consecuencia y envía una señal al proceso SIGCONT, lo que hace que el sistema operativo reanude su ejecución. En el shell de Bash , un programa se puede ejecutar como un trabajo en segundo plano agregando un ampersand ( & ) a la línea de comando; su salida también se dirige a la terminal (potencialmente intercalada con las salidas de otros programas), pero en este caso no podrá leer desde la entrada de la terminal.

Un proceso en segundo plano que intente leer o escribir en su terminal de control enviará una señal SIGTTIN(para entrada) o SIGTTOU(para salida). Estas señales detienen el proceso de forma predeterminada, pero también se pueden manejar de otras formas. Los shells a menudo anulan la acción de detención predeterminada SIGTTOUpara que los procesos en segundo plano proporcionen su salida predeterminada al terminal de control. En los shells compatibles con Bash, el comando kill puede señalar trabajos por ID de proceso, así como por ID de grupo de procesos, señalando el trabajo a todo su grupo de procesos, y los trabajos especificados por ID deben "eliminarse" enviando el prefijo " % ". SIGKILLKill puede enviar cualquier señal a un trabajo, pero si la intención es eliminar los procesos del sistema, es probable que las señales y SIGTERM(predeterminadas) sean las más aplicables . Un trabajo que se ejecuta en primer plano se puede detener de forma permanente escribiendo los caracteres de comando "terminar proceso" ( Ctrl+ C).

Notas

  1. Aquí, "tarea" es un término no técnico para alguna actividad, mientras que "proceso" y "tarea" son conceptos específicos del campo de los sistemas operativos.
  2. IEEE Std 1003.1-2001, Sección 3.201, trabajo archivado el 9 de octubre de 2010 en Wayback Machine .
  3. ID es una referencia de shell abstracta a un recurso (grupo de procesos) administrado externamente por el sistema operativo, por lo tanto, es un identificador
  4. IEEE Std 1003.1-2001, Sección 3.203, Job Control Job ID Archivado el 9 de octubre de 2010 en Wayback Machine .
  5. 7.1 Conceptos básicos de control de trabajos . Consultado el 14 de noviembre de 2015. Archivado desde el original el 29 de octubre de 2015.
  6. Prólogo de Bill Joy en Anderson, Gail; Pablo Anderson. La guía de campo de UNIX C Shell  (neopr.) . - Prentice-Hall , 1986. - S. xvii. — ISBN 0-13-937468-X .

Literatura

Enlaces