Articulo de referencia

Control de trabajos (Unix)

En un sistema operativo Unix o similar , el control de trabajos se refiere al control de un grupo de procesos como un trabajo a través de un intérprete de comandos . [ 1 ] Las f...

En un sistema operativo Unix o similar , el control de trabajos se refiere al control de un grupo de procesos como un trabajo a través de un intérprete de comandos . [ 1 ] Las funciones de control incluyen suspender, reanudar y terminar, y se pueden realizar funciones más avanzadas enviando una señal a un trabajo. El control de trabajos permite al usuario gestionar el procesamiento en el entorno multiprocesador basado en Unix y es distinto del control general de trabajos informáticos .

El control de trabajos fue implementado por primera vez en el shell C por Jim Kulp, [ 2 ] entonces en IIASA en Austria, utilizando características del kernel BSD 4.1. KornShell , desarrollado en Bell Labs , lo adoptó y posteriormente se incorporó a la versión SVR4 del shell Bourne , y está presente en la mayoría de los shells Unix modernos.

Trabajo

Un trabajo engloba todos los procesos que se inician para el manejo de una línea de comandos de shell . Una línea de comandos simple puede iniciar un solo proceso, pero puede generar múltiples procesos, ya que un proceso puede crear procesos secundarios y una línea de comandos puede especificar una secuencia de múltiples comandos. Por ejemplo, la siguiente línea de comandos selecciona las líneas que contienen el texto "título", las ordena alfabéticamente y muestra el resultado en un paginador de terminal : grep title somefile.txt | sort | less. Esto crea al menos tres procesos: uno para grep, uno para sorty uno para less. El control de trabajos permite que el shell controle estos procesos como una sola entidad.

ID del trabajo

Un trabajo se identifica mediante un ID de trabajo numérico , también conocido como número de trabajo , que se clasifica como un identificador ya que es una referencia abstracta a un recurso (un grupo de procesos). Un valor de ID, precedido por %, se puede usar con un comando de control de trabajos para especificar un trabajo. Las referencias especiales %%y %+se refieren al trabajo predeterminado, el que se seleccionaría si no se especificara ninguno. [ 3 ] La documentación de Bash se refiere a una referencia (que comienza con %) como una especificación de trabajo (abreviatura de especificación de trabajo). [ 4 ]

Los valores de ID de control de trabajos generalmente solo se utilizan en un intérprete de comandos interactivo. En la programación de scripts, se utilizan valores PGID, ya que son más precisos y robustos, y de hecho, el control de trabajos está deshabilitado por defecto en un script bash.

Primer plano/fondo

Por defecto, un trabajo se ejecuta en primer plano, donde utiliza entrada y salida interactivas . El usuario introduce una línea de comandos e interactúa con los procesos, pero no puede ejecutar otro comando hasta que finalice el trabajo actual. Muchas operaciones (por ejemplo, listar archivos) son relativamente rápidas, por lo que el usuario puede esperar una respuesta con poco tiempo de inactividad, y algunas operaciones (por ejemplo, editar) requieren interacción, lo cual solo es posible mediante un trabajo en primer plano. Sin embargo, si no se requiere interacción y la operación impide el acceso a la consola durante un tiempo prolongado, el usuario puede optar por ejecutarla en segundo plano , donde los procesos no pueden acceder a la entrada interactiva, pero el usuario puede realizar otras operaciones en primer plano mientras el trabajo en segundo plano se ejecuta simultáneamente. Por defecto, los trabajos en segundo plano envían la salida al flujo de salida interactiva, lo que provoca que la salida de los trabajos en primer plano y en segundo plano se intercale, aunque un usuario puede redirigir la salida de un trabajo en segundo plano para evitarlo.

Control

POSIX especifica la interfaz de usuario para el control de trabajos , modelada en el shell Korn. [ 5 ] Los comandos se implementan normalmente como funciones integradas del shell , no como programas separados .

Iniciar en segundo plano
Si una línea de comandos termina con &, entonces el trabajo se inicia en segundo plano.
Pausar el trabajo en primer plano
El trabajo en primer plano se puede pausar pulsando Ctrl+ Z . En este estado, un trabajo se puede reanudar en segundo plano mediante bgo reanudar en primer plano mediante fg.
Dominiofg
El comando fg(abreviatura de primer plano ) mueve la tarea en segundo plano al primer plano, ya sea la tarea especificada o la que se agregó más recientemente si no se especificó ninguna. Cuando la tarea en primer plano se pausa (mediante + ), este comando la reanuda.Ctrl Z
Dominiowait
El comando waitpausa la sesión interactiva hasta que finalicen los trabajos en segundo plano especificados o todos los trabajos en segundo plano del shell activo si no se especifica ninguno. [ 6 ]
Dominiobg
El comando bg(abreviatura de background ) mueve el trabajo en primer plano que estaba en pausa al segundo plano y lo reanuda.
Dominiojobs
El comando jobsinforma sobre cada tarea en segundo plano, incluyendo su ID, la línea de comandos y el estado de ejecución (detenida o en ejecución).

Señales

La comunicación entre procesos para el control de trabajos se implementa mediante señales .

Normalmente, un intérprete de comandos mantiene información sobre los trabajos en segundo plano en una tabla de trabajos. Cuando finaliza una sesión interactiva (es decir, el usuario cierra sesión ), el intérprete envía la señal SIGHUP a todos los trabajos y espera a que los grupos de procesos terminen antes de finalizar. Algunos intérpretes de comandos ofrecen un comando no POSIX disownque elimina un trabajo de la tabla de trabajos. El grupo de procesos se convierte en un huérfano . El intérprete de comandos no le enviará SIGHUP ni esperará a que finalice. Esta es una técnica para habilitar un proceso como un demonio propiedad directamente del proceso raíz init . El comando POSIX nohupproporciona una forma alternativa de evitar que un trabajo sea finalizado por el intérprete de comandos.

Al suspender el trabajo en primer plano (mediante + ), se envía la señal SIGTSTP (detención de terminal) a los procesos del grupo de procesos del trabajo. Por defecto, esta señal provoca una pausa en el proceso para que el intérprete de comandos pueda reanudarse. Sin embargo, un proceso puede ignorar la señal. Un proceso también puede pausarse mediante la señal SIGSTOP (detención), que no puede ignorarse.Ctrl Z

Cuando el usuario pulsa + , el intérprete de comandos envía la señal SIGINT (interrupción) a cada proceso del grupo de procesos del trabajo en primer plano, que por defecto lo termina, aunque un proceso puede ignorar la señal.Ctrl C

Cuando se reanuda un trabajo detenido (mediante bgo fg), el intérprete de comandos cambia el grupo de procesos en primer plano del terminal que controla la sesión y reanuda el trabajo enviando la señal SIGCONT a todos los procesos del grupo de procesos del trabajo. Si el trabajo se reanudó en primer plano, el grupo de procesos en primer plano del terminal que controla el trabajo se establece en el grupo de procesos del trabajo; si el trabajo se reanudó en segundo plano, se establece en otro grupo de procesos.

Un proceso en segundo plano que intenta leer o escribir en su terminal de control recibe la señal SIGTTIN (para entrada) o SIGTTOU (para salida), ya que el grupo de procesos del proceso no coincide con el grupo de procesos en primer plano de la terminal. Estas señales detienen el proceso por defecto, pero también pueden gestionarse de otras maneras. Los intérpretes de comandos suelen anular la acción de detención predeterminada de SIGTTOU, de modo que los procesos en segundo plano envían su salida a la terminal de control por defecto.

En bash, el killcomando integrado (no /bin/kill) puede enviar señales a los trabajos por ID, así como por ID de grupo de procesos. Enviar una señal a un trabajo la envía a cada proceso del grupo. killpuede enviar cualquier señal a un trabajo; sin embargo, si la intención es eliminar los procesos del sistema, las señales SIGKILL y SIGTERM (la predeterminada) son probablemente las más adecuadas.

Referencias

  1. Norma IEEE 1003.1-2001, Sección 3.201, Trabajo archivado el 1 de agosto de 2019 en Wayback Machine
  2. 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.
  3. Norma IEEE Std 1003.1-2001, Sección 3.203, Control de trabajos ID de trabajo Archivado el 9 de octubre de 2010 en Wayback Machine
  4. "7.1 Conceptos básicos de control de trabajos" . Archivado del original el 2 de agosto de 2016. Consultado el 22 de julio de 2016 .
  5. Referencia de shell y utilidades, La especificación única de UNIX , versión 5 de The Open Group ;Referencia de shell y utilidades, La especificación única de UNIX , versión 5 de The Open Group .bg  fg  
  6. Kerrisk, Michael (2 de febrero de 2025). "wait(1p) — Página del manual de Linux" . man7.org . Archivado del original el 16 de mayo de 2025. Recuperado el 13 de mayo de 2025 .

Lecturas adicionales

  • Marshall Kirk McKusick y George V. Neville-Neil (2 de agosto de 2004). «Gestión de procesos en FreeBSD: Grupos y sesiones de procesos» . Diseño e implementación del sistema operativo FreeBSD . Addison Wesley. ISBN 0-201-70245-2.
  • "Control de trabajos", Manual de referencia de Bash