En Unix y Unix-como sistemas operativos , control de trabajo se refiere al control de puestos de trabajo por una cáscara , especialmente de forma interactiva, en donde un "trabajo" es la representación de una carcasa para un grupo de procesos . Las funciones básicas de control de trabajos son la suspensión, reanudación o terminación de todos los procesos en el trabajo / grupo de procesos; Se pueden realizar funciones más avanzadas 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
Cuando se utilizan sistemas operativos Unix o similares a Unix a través de un terminal (o emulador de terminal ), un usuario inicialmente solo tendrá un proceso en ejecución, su 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 a el shell, que lee o escribe desde el terminal, y capta las señales enviadas desde el teclado, como la señal de terminación resultante de presionar + .ControlC
Sin embargo, a veces el usuario deseará realizar una tarea mientras usa el terminal para otro propósito. Se dice que una tarea que se está ejecutando pero que no recibe información del terminal se está ejecutando "en segundo plano", mientras que la tarea única que recibe información del terminal está "en primer plano". El control de trabajos es una función desarrollada para hacer esto posible, al permitir que el usuario inicie procesos en segundo plano, envíe procesos que ya se estén ejecutando en segundo plano, lleve los procesos en segundo plano al primer plano y suspenda o finalice procesos.
El concepto de trabajo mapea el concepto (shell) de un solo comando de shell con el concepto (sistema operativo) de los posiblemente muchos procesos que conlleva el comando. Las tareas multiproceso surgen porque los procesos pueden crear procesos secundarios adicionales, y un solo comando de shell puede consistir en una tubería de múltiples procesos de comunicación. Por ejemplo, un comando para seleccionar líneas que contienen el texto "título", ordenarlas alfabéticamente y mostrar el resultado en un buscapersonas .
grep title somefile.txt | ordenar | menos
Esto crea al menos tres procesos: uno para grep , otro para ordenar , y uno paramenos . El control de trabajos permite que el shell controle estos procesos relacionados como una entidad, y cuando un usuario emite la combinación de teclas adecuada (generalmenteControl+Z), todo el grupo de procesos se suspende.
El sistema operativo gestiona los trabajos como un solo 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 cualquier proceso derivado de ella, que están todos en el mismo grupo de procesos.
Se puede hacer referencia a un trabajo mediante un identificador [b] denominado ID de trabajo de control de trabajo o simplementeID de trabajo , que utilizanlas funciones internas de shellpara hacer referencia al trabajo. Los ID de trabajo comienzan con el%
carácter; %n
identifica el trabajon, mientras que%%
identifica el trabajo actual. POSIXespecifica otros ID de trabajo. [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 a la ID de trabajo (con el prefijo%) comoespecificación de trabajo. [3]
El control de trabajos y las identificaciones de trabajos generalmente solo se usan en uso interactivo, donde simplifican la referencia a grupos de procesos; en la creación de scripts, se utilizan PGID, ya que son más precisos y robustos, y de hecho, el control de trabajos está deshabilitado de forma predeterminada en los scripts de bash.
Historia
El control de trabajos fue implementado por primera vez en el shell C por Jim Kulp, [4] luego en IIASA en Austria, haciendo uso de características del kernel 4.1 BSD . El KornShell , desarrollado en Bell Labs, lo adoptó y más tarde 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 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 canalización y sus descendientes. El jobs
comando enumerará los trabajos en segundo plano existentes en la tabla de trabajos, junto con su número de trabajo y el estado del trabajo (detenido o en ejecución). Cuando una sesión termina cuando el usuario cierra la sesión (sale del shell, lo que termina el proceso de líder de sesión ), el proceso del shell envía SIGHUP a todos los trabajos y espera a que los grupos de procesos terminen antes de terminar.
El disown
comando se puede usar para eliminar trabajos de la tabla de trabajos, de modo que cuando finalice la sesión, los grupos de procesos secundarios no se envíen SIGHUP ni el shell espere a que terminen. Por lo tanto, se vuelven procesos huérfanos y el sistema operativo puede terminarlos, aunque más a menudo se usa para que init adopte los procesos (el kernel establece su proceso padre en init) y continúen ejecutándose como demonios . Las alternativas para evitar que se terminen los trabajos incluyen nohup y el uso de un multiplexor de terminal .
Un trabajo que se ejecuta en primer plano se puede detener escribiendo el carácter de suspensión ( Ctrl-Z ). Esto envía la señal de "parada terminal" ( SIGTSTP ) al grupo de procesos. De forma 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 manejador de señales 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 trabajo en segundo plano con la función bg
incorporada o como 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 agregando un ampersand ( &
) a la línea de comando; su salida se dirige al terminal (potencialmente entrelazada con la salida de otros programas), pero no puede leer desde la entrada del 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 a menudo anulan la acción de detención predeterminada de SIGTTOU para que los procesos en segundo plano entreguen su salida al terminal de control de manera predeterminada.
En los shells compatibles con Bash, la función kill
incorporada (no /bin/kill
) puede señalar trabajos por ID de trabajo así como por ID de grupo de proceso: 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 por prefijo %
. kill
puede 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 (las predeterminadas) son probablemente las más aplicables.
Ver también
- Cáscara de C
Notas
- ^ Aquí "tarea" es un término no técnico para "alguna actividad", mientras que "proceso" y "trabajo" son términos técnicos.
- ^ 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
- ^ IEEE Std 1003.1-2001, Sección 3.201, Trabajo
- ^ IEEE Std 1003.1-2001, sección 3.203, ID de trabajo de control de trabajo
- ^ 7.1 Conceptos básicos del control de trabajos
- ^ Prólogo de Bill Joy en Anderson, Gail; Paul Anderson (1986). La guía de campo de UNIX C Shell . Prentice Hall. pag. xvii. ISBN 0-13-937468-X.
- ^ - Referencia de comandos y utilidades, la especificación única de UNIX , número 7 de The Open Group ; - Referencia de comandos y utilidades, la especificación única de UNIX , número 7 de The Open Group .
Otras lecturas
- Marshall Kirk McKusick y George V. Neville-Neil (2 de agosto de 2004). "Gestión de Procesos FreeBSD: Grupos de Procesos y Sesiones" . El diseño e implementación del sistema operativo FreeBSD . Addison Wesley. ISBN 0-201-70245-2.
enlaces externos
- "Control de trabajos", Manual de referencia de Bash