Explore o gerenciamento de processos em primeiro e segundo plano usando o shell Bash no Linux. As funcionalidades e sinais de controle de tarefas do Bash oferecem uma maior flexibilidade na execução de comandos. Vamos detalhar como você pode tirar o máximo proveito dessas ferramentas.
Entendendo Processos
Em sistemas operacionais Linux e similares ao Unix, cada vez que um programa é iniciado, um processo é criado. Um “processo” é a representação interna do programa em execução na memória do computador. Há um processo para cada programa ativo, abrangendo desde seu ambiente de desktop (como GNOME ou KDE) até os daemons que são iniciados durante a inicialização do sistema.
É importante notar que comandos embutidos do Bash, como cd
, pwd
e alias
, não necessitam de um processo separado para serem executados. O Bash os executa diretamente dentro da mesma instância do shell, tornando-os mais rápidos devido à ausência da sobrecarga de criação de um novo processo. Você pode obter uma lista completa desses comandos digitando help
em seu terminal.
Os processos podem ser executados tanto em primeiro plano, onde controlam o terminal até a conclusão, quanto em segundo plano, que permitem que você continue a usar o terminal enquanto o processo é executado (a menos que o processo gere saída de tela).
Exemplificando o Uso
Vamos iniciar um comando ping
para demonstrar. Faremos ping no domínio de exemplo “www.wdzwdz.com” como um processo de primeiro plano:
ping www.wdzwdz.com
Os resultados do ping serão exibidos na tela. Nesse cenário, não é possível realizar mais nenhuma ação no terminal até que o ping
seja finalizado. Para interromper o comando, pressione Ctrl + C
.
Ctrl+C
Note que, após pressionar Ctrl + C
, o ping
fornece um breve resumo antes de terminar.
Agora, repitamos o procedimento, mas em vez de Ctrl + C
, pressionaremos Ctrl + Z
. Isso não encerrará o processo, mas o transformará em uma tarefa em segundo plano, retornando o controle do terminal para nós.
ping www.wdzwdz.com
Ctrl+Z
O processo foi interrompido e transformado em uma tarefa em segundo plano. É semelhante a um carro parado em um sinal de stop: ele está parado, mas ainda presente e pronto para agir.
O comando jobs
exibirá as tarefas iniciadas na sessão de terminal atual. Como tarefas são, fundamentalmente, processos, também podemos utilizar o comando ps
para visualizá-las. Vamos comparar as saídas dos dois comandos, usando a opção T
para listar somente os processos em execução nesta janela de terminal:
jobs
ps T
A saída do comando jobs
nos fornece:
[1]
: O número entre colchetes é o ID do trabalho. Ele é usado para controlar o trabalho com comandos específicos.+
: Indica que este é o trabalho padrão, ou seja, aquele que será afetado por comandos sem um ID de trabalho específico. O trabalho padrão é sempre o último adicionado à lista.Stopped
: O processo não está em execução.ping www.wdzwdz.com
: O comando que deu início ao processo.
Já a saída do comando ps
nos fornece:
PID
: O identificador do processo (Process ID). Cada processo possui um ID único.TTY
: O terminal (pseudo-teletipo) de onde o processo foi iniciado.STAT
: O estado atual do processo.TIME
: A quantidade de tempo de CPU consumida pelo processo.COMMAND
: O comando que deu início ao processo.
Alguns valores comuns para a coluna STAT
incluem:
D
: Sono ininterrupto. O processo está aguardando alguma operação de entrada/saída e não pode ser interrompido.I
: Inativo.R
: Em execução.S
: Sono interrompível.T
: Interrompido por um sinal de controle de trabalho.Z
: Processo zumbi. O processo terminou, mas o processo pai ainda não o limpou.
O valor na coluna STAT
pode conter indicadores extras:
<
: Tarefa de alta prioridade.N
: Tarefa de baixa prioridade.L
: Processo com páginas bloqueadas na memória, utilizado por processos em tempo real.s
: Líder de sessão. O shell Bash é o líder de uma sessão que lança grupos de processos.l
: Processo multi-threaded.+
: Processo em primeiro plano.
O Bash tem um estado Ss
, onde o S
maiúsculo indica que o shell está inativo, mas pode ser interrompido, e o s
minúsculo informa que o shell é o líder da sessão. O comando ping
tem um estado T
, indicando que ele foi interrompido por um sinal de controle de trabalho (no caso, Ctrl+Z
).
O comando ps T
tem estado R+
, significando que está em execução em primeiro plano.
O Comando bg
O comando bg
é usado para retomar um processo em segundo plano. Ele pode ser usado com ou sem um número de trabalho. Se usado sem um número, o trabalho padrão será colocado em primeiro plano, embora continue rodando em segundo plano. Nesse caso, você não poderá enviar nenhuma entrada para ele.
Ao executar o comando bg
, nosso comando ping
será retomado:
bg
A saída do comando ping
voltará a ser exibida no terminal. O nome do comando reiniciado é mostrado.
Como o processo está em segundo plano, não podemos mais interagir diretamente com ele usando Ctrl + C
. A saída do comando ping
se mistura com o que digitamos no terminal, apesar dos nossos comandos serem executados em primeiro plano.
Para interromper nosso processo em segundo plano, precisamos trazê-lo para o primeiro plano.
O Comando fg
O comando fg
traz uma tarefa de segundo plano para o primeiro plano. Assim como bg
, ele pode ser usado com ou sem um número de trabalho. Usá-lo com um número de trabalho especifica qual tarefa deve ser trazida para o primeiro plano. Sem um número de trabalho, o último comando enviado para o segundo plano será usado.
Digitando fg
, o comando ping
é colocado em primeiro plano. Os caracteres que digitamos são misturados com a saída do ping
, mas são interpretados pelo shell como se tivessem sido inseridos normalmente.
fg
Com o ping
agora em primeiro plano, podemos usar Ctrl + C
para finalizá-lo.
Ctrl+C
A Importância dos Sinais
Embora nosso exemplo possa ter sido um pouco caótico, ele ilustrou como colocar um processo em segundo plano, como trazê-lo de volta à execução, como movê-lo para o primeiro plano e, finalmente, como encerrá-lo.
Ao usar Ctrl + C
e Ctrl + Z
, você está enviando sinais para o processo, que são uma forma abreviada de usar o comando kill
. Existem 64 sinais diferentes que o kill
pode enviar. Utilize kill -l
para ver a lista completa. Além do kill
, esses sinais podem ser gerados por outros processos dentro do sistema.
Aqui estão alguns dos sinais mais utilizados:
SIGHUP
(Sinal 1): Enviado automaticamente para um processo quando o terminal em que ele está em execução é fechado.SIGINT
(Sinal 2): Enviado ao processo quando você pressionaCtrl + C
. O processo é instruído a encerrar.SIGQUIT
(Sinal 3): Enviado ao processo se o usuário enviar um sinal de saídaCtrl + D
.SIGKILL
(Sinal 9): O processo é encerrado imediatamente, sem tentativa de fechamento adequado.SIGTERM
(Sinal 15): O sinal padrão enviado pelo comandokill
, sinalizando o término do programa.SIGTSTP
(Sinal 20): Enviado ao processo quando você usaCtrl + Z
, suspendendo o processo e colocando-o em segundo plano.
O comando kill
é usado para enviar sinais que não possuem atalhos de teclado associados.
Mais Controle de Tarefas
Um processo movido para o segundo plano com Ctrl + Z
é pausado. Utilizamos o comando bg
para reiniciá-lo. Para iniciar um programa como um processo em segundo plano, basta adicionar um E comercial &
ao final da linha de comando.
Embora não seja ideal para processos em segundo plano exibir saída no terminal, utilizaremos exemplos para fins de demonstração. O comando abaixo inicia um loop infinito como um processo em segundo plano:
while true; do echo "How-To Geek Loop Process"; sleep 3; done &
O número da tarefa e o ID do processo são exibidos. Neste caso, o número da tarefa é 1 e o ID do processo é 1979. Esses identificadores podem ser usados para controlar o processo.
A saída do loop começará a aparecer no terminal. Como antes, é possível digitar comandos, mas todos serão intercalados com a saída do processo de loop.
ls
Para interromper o processo, usamos o comando jobs
para lembrar o número da tarefa e, em seguida, o comando kill
:
jobs
kill %1
O comando kill
envia o sinal SIGTERM
(sinal 15) para o processo, que é encerrado. Após pressionar Enter, o status da tarefa é exibido como “encerrado”. Se o processo não responder ao sinal SIGTERM
, podemos enviar o sinal SIGKILL
(sinal 9):
kill 9 %1
Resumo
Os comandos abordados incluem:
Ctrl + C
: EnviaSIGINT
(sinal 2) para o processo, instruindo-o a terminar.Ctrl + D
: EnviaSISQUIT
(sinal 3) para o processo, instruindo-o a encerrar.Ctrl + Z
: EnviaSIGSTP
(sinal 20) para o processo, instruindo-o a parar (suspender) e se tornar um processo em segundo plano.jobs
: Lista os trabalhos em segundo plano e mostra seu número.bg job_number
: Reinicia um processo em segundo plano. Sem número de trabalho, o último processo transformado em tarefa de segundo plano é usado.fg job_number
: Traz um processo de segundo plano para o primeiro plano e o reinicia. Sem número de trabalho, o último processo transformado em tarefa de segundo plano é usado.linha de comando &
: Adiciona um&
ao final de uma linha de comando, executando esse comando como uma tarefa em segundo plano.kill %job_number
: EnviaSIGTERM
(sinal 15) para o processo, finalizando-o.kill 9 %job_number
: EnviaSIGKILL
(sinal 9) para o processo, encerrando-o abruptamente.