Como executar e controlar processos em segundo plano no Linux

Use o shell Bash no Linux para gerenciar processos de primeiro e segundo plano. Você pode usar as funções e sinais de controle de trabalho do Bash para oferecer mais flexibilidade na execução de comandos. Nós mostramos como.

Tudo sobre processos

Sempre que um programa é executado em um sistema operacional Linux ou semelhante ao Unix, um processo é iniciado. “Processo” é o nome da representação interna do programa em execução na memória do computador. Existe um processo para cada programa ativo. Na verdade, existe um processo para quase tudo o que está em execução no seu computador. Isso inclui os componentes do seu ambiente gráfico de desktop (GDE) como GNOMO ou KDE, e sistema demônios que são lançados na inicialização.

Por que quase tudo o que está em execução? Bem, embutidos do Bash, como CD, pwd, e apelido não precisa ter um processo iniciado (ou “gerado”) quando eles são executados. O Bash executa esses comandos na instância do shell Bash que está sendo executado na janela do seu terminal. Esses comandos são rápidos precisamente porque não precisam ter um processo iniciado para serem executados. (Você pode digitar ajuda em uma janela de terminal para ver a lista de componentes integrados do Bash.)

Os processos podem ser executados em primeiro plano, caso em que assumem o controle do seu terminal até que sejam concluídos, ou podem ser executados em segundo plano. Os processos executados em segundo plano não dominam a janela do terminal e você pode continuar a trabalhar nela. Ou, pelo menos, eles não dominam a janela do terminal se não geram a saída da tela.

Um exemplo bagunçado

Vamos começar um ping simples rastreamento correndo. Vamos fazer ping no domínio How-To Geek. Isso será executado como um processo de primeiro plano.

ping www.wdzwdz.com

Obtemos os resultados esperados, rolando para baixo na janela do terminal. Não podemos fazer mais nada na janela do terminal enquanto o ping está em execução. Para encerrar o comando, pressione Ctrl + C.

Ctrl+C

O efeito visível do Ctrl + C é destacado na imagem. O ping fornece um breve resumo e, em seguida, para.

Vamos repetir isso. Mas, desta vez, pressionaremos Ctrl + Z em vez de Ctrl + C. A tarefa não será encerrada. Isso se tornará uma tarefa em segundo plano. Obtemos o controle da janela do terminal de volta para nós.

ping www.wdzwdz.com
Ctrl+Z

O efeito visível de pressionar Ctrl + Z é destacado na captura de tela.

Desta vez, somos informados de que o processo foi interrompido. Parado não significa encerrado. É como um carro em uma placa de pare. Não o descartamos e jogamos fora. Ainda está na estrada, parado, esperando para ir. O processo agora é um trabalho em segundo plano.

  4 ótimos aplicativos para fazer anotações no Linux

O comando jobs irá listar os empregos que foram iniciados na sessão de terminal atual. E como os jobs são (inevitavelmente) processos, também podemos usar o comando ps para vê-los. Vamos usar os dois comandos e comparar suas saídas. Usaremos a opção T (terminal) para listar apenas os processos que estão sendo executados nesta janela de terminal. Observe que não há necessidade de usar um hífen – com a opção T.

jobs
ps T

O comando jobs nos diz:

[1]: O número entre colchetes é o número do trabalho. Podemos usar isso para nos referirmos ao trabalho quando precisarmos controlá-lo com comandos de controle de trabalho.
+: O sinal de mais + mostra que este é o trabalho que terá efeito se usarmos um comando de controle de trabalho sem um número de trabalho específico. É chamado de trabalho padrão. O trabalho padrão é sempre aquele adicionado mais recentemente à lista de trabalhos.
Parado: o processo não está em execução.
ping www.wdzwdz.com: A linha de comando que iniciou o processo.

O comando ps nos diz:

PID: O ID do processo do processo. Cada processo possui um ID único.
TTY: O pseudo-teletipo (janela de terminal) a partir do qual o processo foi executado.
STAT: o status do processo.
TEMPO: A quantidade de tempo de CPU consumido pelo processo.
COMANDO: O comando que iniciou o processo.

Estes são valores comuns para a coluna STAT:

D: Sono ininterrupto. O processo está em um estado de espera, geralmente aguardando uma entrada ou saída, e não pode ser interrompido.
I: inativo.
R: Correndo.
S: Sono interrompível.
T: Parado por um sinal de controle de trabalho.
Z: Um processo zumbi. O processo foi encerrado, mas não foi “limpo” por seu processo pai.

O valor na coluna STAT pode ser seguido por um destes indicadores extras:

<: high-priority="" task="" nice="" to="" other="" processes="" n:="" low-priority="" l:="" process="" has="" pages="" locked="" into="" memory="" used="" by="" real-time="" s:="" a="" session="" leader.="" leader="" is="" that="" launched="" groups.="" shell="" multi-thread="" process.="" foreground="">Podemos ver que Bash tem um estado de Ss. O “S” maiúsculo indica que o shell Bash está inativo e pode ser interrompido. Assim que precisarmos, ele responderá. O “s” minúsculo nos diz que o shell é o líder da sessão.

O comando ping tem um estado de T. Isso nos diz que o ping foi interrompido por um sinal de controle de trabalho. Neste exemplo, foi o Ctrl + Z que usamos para colocá-lo em segundo plano.

O comando ps T tem um estado de R, que significa running. O + indica que este processo é membro do grupo de primeiro plano. Portanto, o comando ps T está sendo executado 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 você usá-lo sem um número de trabalho, o trabalho padrão será colocado em primeiro plano. O processo ainda é executado em segundo plano. Você não pode enviar nenhuma entrada para ele.

Se emitirmos o comando bg, retomaremos nosso comando ping:

bg

O comando ping é retomado e vemos a saída de rolagem na janela do terminal mais uma vez. O nome do comando que foi reiniciado é exibido para você. Isso é destacado na captura de tela.

  Como ocultar arquivos no Linux e protegê-los

Mas temos um problema. A tarefa está sendo executada em segundo plano e não aceita entrada. Então, como podemos parar isso? Ctrl + C não faz nada. Podemos ver quando o digitamos, mas a tarefa em segundo plano não recebe esses pressionamentos de tecla, então continua executando o ping alegremente.

Na verdade, agora estamos em um estranho modo combinado. Podemos digitar na janela do terminal, mas o que digitamos é rapidamente eliminado pela saída de rolagem do comando ping. Tudo o que digitarmos entrará em vigor em primeiro lugar.

Para interromper nossa tarefa em segundo plano, precisamos trazê-la para o primeiro plano e, em seguida, interrompê-la.

O Comando fg

O comando fg trará uma tarefa em segundo plano para o primeiro plano. Assim como o comando bg, ele pode ser usado com ou sem um número de trabalho. Usá-lo com um número de trabalho significa que ele operará em um trabalho específico. Se for usado sem um número de trabalho, será usado o último comando enviado para segundo plano.

Se digitarmos fg, nosso comando ping será colocado em primeiro plano. Os caracteres que digitamos são misturados com a saída do comando ping, mas são operados pelo shell como se tivessem sido inseridos na linha de comando normalmente. E, de fato, do ponto de vista do shell Bash, foi exatamente isso o que aconteceu.

fg

E agora que temos o comando ping rodando em primeiro plano mais uma vez, podemos usar Ctrl + C para eliminá-lo.

Ctrl+C

Precisamos enviar os sinais corretos

Isso não era exatamente bonito. Evidentemente, a execução de um processo em segundo plano funciona melhor quando o processo não produz saída e não requer entrada.

Mas, confuso ou não, nosso exemplo conseguiu:

Colocando um processo em segundo plano.
Restaurando o processo para um estado de execução em segundo plano.
Retornando o processo ao primeiro plano.
Encerrando o processo.

Ao usar Ctrl + C e Ctrl + Z, você está enviando sinais para o processo. Estes são formas de taquigrafia de usar o comando kill. Há 64 sinais diferentes que matar pode enviar. Use kill -l na linha de comando para listá-los. kill não é a única fonte desses sinais. Alguns deles são gerados automaticamente por outros processos dentro do sistema

Aqui estão alguns dos mais usados.

SIGHUP: Sinal 1. Enviado automaticamente para um processo quando o terminal em que ele está sendo executado é fechado.
SIGINT: Sinal 2. Enviado para um processo que você pressiona Ctrl + C. O processo é interrompido e instruído a encerrar.
SIGQUIT: Sinal 3. Enviado para um processo se o usuário enviar um sinal de saída Ctrl + D.
SIGKILL: Sinal 9. O processo é encerrado imediatamente e não tentará encerrar de forma limpa. O processo não ocorre normalmente.
SIGTERM: Sinal 15. Este é o sinal padrão enviado por kill. É o sinal de término do programa padrão.
SIGTSTP: Sinal 20. Enviado para um processo quando você usa Ctrl + Z. Ele interrompe o processo e o coloca em segundo plano.

  Como instalar Adwaita Tweaks para Gnome Shell no Linux

Devemos usar o comando kill para emitir sinais que não possuem combinações de teclas atribuídas a eles.

Mais controle de trabalho

Um processo movido para o segundo plano usando Ctrl + Z é colocado no estado parado. Temos que usar o comando bg para reiniciá-lo. Para iniciar um programa como um processo em execução em segundo plano, é simples. Anexe um E comercial & ao final da linha de comando.

Embora seja melhor que os processos em segundo plano não gravem na janela do terminal, usaremos exemplos que o fazem. Precisamos ter algo nas imagens que possamos consultar. Este comando iniciará um loop infinito como um processo em segundo plano:

enquanto verdadeiro; faça eco “How-To Geek Loop Process”; dormir 3; feito &

enquanto verdadeiro;  fazer eco

Somos informados do número do trabalho e do ID do processo do processo. Nosso número de trabalho é 1 e a identificação do processo é 1979. Podemos usar esses identificadores para controlar o processo.

A saída de nosso loop infinito começa a aparecer na janela do terminal. Como antes, podemos usar a linha de comando, mas todos os comandos que emitimos são intercalados com a saída do processo de loop.

ls

Para interromper nosso processo, podemos usar jobs para nos lembrarmos de qual é o número do job e, em seguida, usar kill.

jobs relata que nosso processo é o job número 1. Para usar esse número com kill, devemos precedê-lo com um sinal de porcentagem%.

jobs
kill %1

kill envia o sinal SIGTERM, sinal número 15, para o processo e ele é encerrado. Quando a tecla Enter é pressionada em seguida, um status do trabalho é mostrado. Ele lista o processo como “encerrado”. Se o processo não responder ao comando kill, você pode aumentá-lo um pouco. Use kill com SIGKILL, sinal número 9. Basta colocar o número 9 entre o comando kill e o número do trabalho.

kill 9 %1

Coisas que cobrimos

Ctrl + C: Envia SIGINT, sinal 2, para o processo – se estiver aceitando entrada – e diz para terminar.
Ctrl + D: Envia SISQUIT, sinal 3, para o processo – se estiver aceitando entrada – e diz a ele para encerrar.
Ctrl + Z: Envia SIGSTP, sinal 20, para o processo e diz a ele para parar (suspender) e se tornar um processo em segundo plano.
jobs: Lista os jobs em segundo plano e mostra seu número.
bg job_number: reinicia um processo em segundo plano. Se você não fornecer um número de trabalho, o último processo que foi transformado em uma tarefa em segundo plano será usado.
fg job_number: traz um processo de segundo plano para o primeiro plano e o reinicia. Se você não fornecer um número de trabalho, o último processo que foi transformado em uma tarefa em segundo plano será usado.
linha de comando &: Adicionar um “e” comercial & ao final de uma linha de comando executa esse comando como uma tarefa em segundo plano, que está em execução.
kill% job_number: Envia SIGTERM, sinal 15, para o processo finalizá-lo.
kill 9% job_number: Envia SIGKILL, sinal 9, para o processo e o termina abruptamente.