# Controle de trabalhos (Unix)

Em sistemas operacionais Unix e tipo Unix, controle de trabalhos (job control) é o controle, especialmente interativo, realizado por um shell no qual os "trabalhos" são uma representação para um grupo de processos para o shell. Recursos básicos de controle de trabalho são a suspensão, resumo ou terminação para todos os processos no grupo de trabalhos/processos. Recursos mais avançados podem ser realizados por meio do envio de sinais ao trabalho. O controle de trabalhos é de interesse particular no Unix devido ao seu multiprocessamento, e deve ser distinguido do controle de trabalhos mais geral, que é aplicado frequentemente à execução sequencial (processamento em lote).

## Visão geral

Ao usar sistemas operacionais Unix ou tipo Unix por meio de um terminal (ou emulador de terminal), um usuário terá, inicialmente, apenas um único processo em execução, o seu shell de login. A maioria das tarefas (listagem de diretórios, edição de arquivos, etc.) pode ser facilmente executada, permitindo que o programa assuma o controle do terminal e retornando o controle ao shell quando o programa finaliza - formalmente, anexando a entrada padrão e saída padrão ao shell, que lê ou grava a partir do terminal, e captura sinais enviados do teclado, como o sinal de terminação resultante do pressionamento das teclas Control + C.
No entanto, às vezes, o usuário deseja realizar uma tarefa enquanto usa o terminal para outra finalidade. Uma tarefa que está sendo executada, mas não está recebendo entrada do terminal, está sendo executada "em segundo plano", enquanto a tarefa única que está recebendo entrada do terminal está "em primeiro plano". O controle de trabalhos é uma facilidade desenvolvida para tornar isso possível, permitindo que o usuário inicie processos em segundo plano, envie processos em execução para o segundo plano, traga processos em segundo plano para o primeiro plano e suspenda ou encerre processos.
O conceito de um trabalho mapeia o conceito (de shell) de um único comando de shell para o conceito (de sistema operacional) dos possivelmente muitos processos que o comando envolve. Tarefas de vários processos acontecem porque os processos podem criar processos filhos adicionais e um único comando de shell pode consistir de um encadeamento de vários processos que se comunicam. Por exemplo, um comando para selecionar linhas contendo o texto "título", ordená-las alfabeticamente e exibir o resultado em um paginador.
Isso cria pelo menos três processos: um para grep, um para sort e um para less. O controle de trabalhos permite que o shell controle esses processos relacionados como uma entidade e, quando um usuário emite a combinação de chaves apropriada (geralmente Control + Z), todo o grupo de processos é suspenso.
Os trabalhos são gerenciados pelo sistema operacional como um único grupo de processos e o trabalho é a representação interna do shell de tal grupo. Isso é definido no POSIX como:
Um trabalho pode ser referido por um handle chamado de job control job ID (ID de trabalho de controle de trabalho) ou simplesmente job ID (ID de trabalho), que é usado pelos comandos internos do shell para se referir ao trabalho. Os IDs de trabalho começam com o caractere %. %n identifica o trabalho n, enquanto que %% identifica o trabalho atual. Outros IDs de trabalho são especificados pelo POSIX. Em uso informal, o número pode ser chamado de "número do trabalho" ou "ID do trabalho" e a documentação do Bash refere-se ao ID do trabalho (prefixado com %) como o jobspec.
Normalmente, o controle de trabalhos e os IDs de trabalho são usados ​​apenas no uso interativo, onde simplificam a referência aos grupos de processos. Entretanto, em scripts são usados os PGIDs, pois são mais precisos e robustos e, de fato, o controle de trabalhos é desabilitado por padrão nos scripts bash.