6. Iniciando e Tratando Processo em Segundo Plano: Controle de Trabalhos

Você provavelmente notou que ao entrar com um comando no Terminal, você normalmente tem que esperar comando terminar antes de o shell retornar o controle para você. Isso indica que você mandou executar o comando em primeiro plano. Entretanto, existem ocasiões e em que esse não é o comportamento desejado.

Suponha, por exemplo, que você decida copiar recursivamente um diretório grande para um outro. Você também decidiu ignorar os erros, então redirecionou a saída de erros para /dev/null:

cp -R images/ /shared/ 2>/dev/null

Um comando como esse pode demorar vários minutos até terminar de ser executado. Você então tem duas soluções: a primeira é violenta, e implica em parar (matar) o comando e reexecutá-lo quando tiver tempo. Para fazer isso, pressione as teclas Ctrl-C: isso irá terminar o processo e levá-lo de volta ao prompt. Mas espere, não faça-o ainda! Leia mais um pouco.

Suponha que você quer que o comando continue executando enquanto faz alguma outra coisa. A solução então é colocá-lo para executar em segundo plano. Para fazer isso, pressione as teclas Ctrl-Z para suspender o processo:

$ cp -R images/ /shared/ 2>/dev/null
# Type C-z here
[1]+  Stopped                 cp -R images/ /shared/ 2>/dev/null
$

e novamente você é levado ao prompt. O processo está parado, esperando que seja reiniciado (como mostrado pela palavra-chave Stopped). Isso é exatamente o que deseja fazer, porém, é claro, em segundo plano. Digite o comando bg (de Segundo Plano - BackGround) para executar o processo em segundo plano:

$ bg
[1]+ cp -R images/ /shared/ 2>/dev/null &
$

O processo então irá começar a executar em segundo plano, como indicado pelo caractere & (e comercial) ao final da linha. Você então será levado novamente ao prompt e poderá continuar trabalhando. Um processo que executa como tarefa de segundo planou, ou em segundo plano, é chamado de job ou trabalho de segundo plano.

É claro, você pode iniciar processos diretamente como tarefas de segundo plano, simplesmente adicionando um caractere & ao final da linha de comando. Por exemplo, você pode iniciar um comando para copiar um diretório em segundo plano simplesmente digitando:

$ cp -R images/ /shared/ 2>/dev/null &

Se você quiser, também pode restaurar esse processo para primeiro plano e esperar ele terminar, utilizando o comando fg (Primeiro Plano - ForeGround). Para colocá-lo em segundo plano novamente, digite as teclas Ctrl-Z, bg.

Você pode iniciar vários processos dessa maneira: cada comando terá um número de trabalho (job). O comando do shell jobs lista todos os trabalhos associados com o shell corrente. O trabalho precedido de um caractere + indica o último processo que foi iniciado como tarefa de segundo plano. Para restaurar um trabalho particular no primeiro plano, você pode digitar fg <n> onde <n> é o número do trabalho ou job, i.e. fg 5.

Observe que você também pode suspender ou iniciar aplicações de tela cheia desta maneira, como o comando less ou um editor de texto como o Vi, e restaurá-los no primeiro plano se desejar.