Execução em Segundo Plano no Linux

LinuxBeginner
Pratique Agora

Introdução

O Linux oferece recursos poderosos para gerenciar processos, permitindo que os usuários executem comandos em segundo plano enquanto continuam trabalhando no terminal. Essa funcionalidade é essencial ao lidar com tarefas demoradas que não exigem monitoramento constante. Neste laboratório, você aprenderá a executar processos em segundo plano, verificar seu status e gerenciá-los de forma eficaz. Essas habilidades são fundamentais para qualquer usuário Linux e proporcionam maior flexibilidade ao trabalhar em ambientes de linha de comando.

Compreendendo Processos em Segundo Plano

No Linux, os processos podem ser executados em primeiro plano (foreground) ou em segundo plano (background). Um processo em primeiro plano é aquele que ocupa seu terminal até ser concluído, impedindo que você execute outros comandos. Um processo em segundo plano, no entanto, é executado sem bloquear seu terminal, permitindo que você continue usando a linha de comando.

Vamos primeiro criar um script simples que simula uma tarefa de longa duração. Isso nos ajudará a demonstrar processos em segundo plano.

Navegue até o diretório do projeto:

cd ~/project

Crie um arquivo chamado long-task.sh usando o editor nano:

nano long-task.sh

Adicione o seguinte conteúdo ao arquivo:

#!/bin/bash
## This script simulates a long-running task
echo "Starting long task..."
for i in {1..20}; do
  echo "Processing step $i..."
  sleep 5
done
echo "Long task completed."

Pressione Ctrl+O seguido de Enter para salvar o arquivo, e depois Ctrl+X para sair do nano.

Torne o script executável alterando suas permissões:

chmod +x long-task.sh

Agora, execute o script em primeiro plano:

./long-task.sh

Você verá o script exibir cada etapa com um atraso de 5 segundos. Observe que, durante esse tempo, você não pode inserir outros comandos no terminal porque o processo está sendo executado em primeiro plano.

Pressione Ctrl+C para encerrar o script antes que ele seja concluído.

Executando Processos em Segundo Plano

Para executar um processo em segundo plano, basta adicionar um e comercial (&) ao final do comando. Isso instrui o shell a executar o comando em segundo plano.

Vamos executar nosso script long-task.sh em segundo plano:

cd ~/project
./long-task.sh &

Você deverá ver uma saída semelhante à seguinte:

[1] 1234
Starting long task...
Processing step 1...

Aqui, [1] é o número do job (job number) atribuído pelo shell, e 1234 é o identificador do processo (PID - Process ID). O número do job é usado para se referir a este processo em segundo plano dentro do shell, enquanto o PID é usado pelo sistema operacional para identificar o processo.

Observe que, após a saída inicial, você recebe de volta o prompt de comando. Agora você pode continuar a inserir outros comandos enquanto o script é executado em segundo plano.

Por exemplo, tente criar outro arquivo:

echo "I can do other work while the script runs" > background-demo.txt
cat background-demo.txt

Você verá que pode continuar trabalhando no terminal enquanto ocasionalmente vê a saída do script em segundo plano. Isso é muito útil para executar tarefas demoradas sem bloquear sua sessão de terminal.

Nota Importante: É completamente normal ver a saída do processo em segundo plano aparecendo em seu terminal. Quando você executa um processo em segundo plano usando &, o processo é executado em segundo plano, mas seus fluxos de saída (stdout e stderr) ainda estão conectados ao seu terminal. Isso significa que:

  • O processo está sendo executado em segundo plano (você pode inserir outros comandos)
  • O processo continua a ser executado sem bloquear seu terminal
  • A saída ainda aparece em sua tela (o que pode se misturar com seus outros comandos)

Esse comportamento é esperado e demonstra que o processo em segundo plano está ativo e produzindo saída.

Verificando Processos em Segundo Plano

O Linux fornece vários comandos para verificar quais processos estão sendo executados em segundo plano. Os dois mais comuns são jobs e ps.

Usando o Comando jobs

O comando jobs mostra o status de todos os jobs em segundo plano na sessão atual do shell:

jobs

Você deverá ver uma saída semelhante a:

[1]+  Running    ./long-task.sh &

O sinal + indica que este é o job padrão atual, o que significa que ele será operado se você usar comandos como fg ou bg sem especificar um número de job.

Usando o Comando ps

Enquanto jobs mostra apenas os processos iniciados a partir do shell atual, o comando ps pode mostrar todos os processos em execução no sistema:

ps aux | grep long-task.sh

A saída deve incluir uma linha para o seu script em segundo plano:

labex     1234  0.0  0.0   4508  1996 pts/0    S    12:34   0:00 /bin/bash ./long-task.sh

Vamos criar outro processo em segundo plano para que possamos ver múltiplos jobs:

cd ~/project
nano another-task.sh

Adicione o seguinte conteúdo:

#!/bin/bash
## This script simulates another task
echo "Starting another task..."
for i in {1..20}; do
  echo "Another task - step $i..."
  sleep 5
done
echo "Another task completed."

Salve e saia do nano (Ctrl+O, Enter, Ctrl+X), em seguida, torne o script executável:

chmod +x another-task.sh

Execute este script em segundo plano também:

./another-task.sh &

Agora verifique seus jobs em segundo plano novamente:

jobs

Você deverá ver ambos os jobs listados:

[1]-  Running    ./long-task.sh &
[2]+  Running    ./another-task.sh &

Gerenciando Processos em Segundo Plano

Agora que temos processos em execução em segundo plano, vamos aprender a gerenciá-los. O Linux fornece vários comandos para controlar processos em segundo plano:

Trazendo um Processo em Segundo Plano para o Primeiro Plano

O comando fg traz um processo em segundo plano para o primeiro plano. Se você tiver vários jobs em segundo plano, pode especificar qual deles usando seu número de job.

Vamos trazer nosso primeiro job para o primeiro plano:

fg %1

O %1 refere-se ao job número 1. Você verá a saída do script long-task.sh aparecendo em seu terminal, e seu prompt de comando ficará indisponível até que o processo seja concluído ou você o interrompa.

Para interromper o processo e retornar ao prompt de comando, pressione Ctrl+C.

Enviando um Processo em Primeiro Plano para o Segundo Plano

Você também pode enviar um processo em primeiro plano para o segundo plano. Primeiro, suspenda o processo em primeiro plano com Ctrl+Z, em seguida, use o comando bg para continuá-lo em segundo plano.

Inicie um novo processo em primeiro plano:

cd ~/project
./long-task.sh

Após alguns segundos, pressione Ctrl+Z para suspender o processo. Você verá uma mensagem como:

[1]+  Stopped    ./long-task.sh

Agora, continue-o em segundo plano:

bg

O processo será retomado em segundo plano, e você verá:

[1]+ ./long-task.sh &

Você pode verificar se ele está em execução com:

jobs

Terminando Processos em Segundo Plano

Para terminar um processo em segundo plano, você pode usar o comando kill com o número do job ou o ID do processo:

kill %1

Ou usando o PID (substitua 1234 pelo PID real da sua saída ps):

kill 1234

Para verificar se o processo foi terminado:

jobs

Você pode ver uma mensagem indicando que o job foi terminado:

[1]+  Terminated    ./long-task.sh

Executando Processos Após Logout

Às vezes, você precisa que um processo continue em execução mesmo após sair do terminal. O comando nohup permite que você execute um comando que continuará em execução mesmo após sair do shell.

Vamos criar um script que rodará por muito tempo:

cd ~/project
nano persistent-task.sh

Adicione o seguinte conteúdo:

#!/bin/bash
## This script runs for a very long time
echo "Starting persistent task at $(date)" > persistent-output.log
for i in {1..100}; do
  echo "Iteration $i at $(date)" >> persistent-output.log
  sleep 10
done
echo "Persistent task completed at $(date)" >> persistent-output.log

Salve e saia do nano, em seguida, torne o script executável:

chmod +x persistent-task.sh

Agora, execute-o com nohup e coloque-o em segundo plano:

nohup ./persistent-task.sh &

Você verá uma saída semelhante a:

[1] 5678
nohup: ignoring input and appending output to 'nohup.out'

Isso significa que o processo está em execução em segundo plano e continuará mesmo que você saia. A saída que normalmente iria para o terminal é redirecionada para um arquivo chamado nohup.out.

Dica para Gerenciar a Saída: Se você não quiser que a saída do processo em segundo plano apareça em seu terminal e potencialmente interfira em seu trabalho, você pode redirecionar a saída para um arquivo:

## Redireciona a saída para um arquivo específico
./long-task.sh > task-output.log 2>&1 &

## Ou redireciona para /dev/null para descartar a saída completamente
./long-task.sh > /dev/null 2>&1 &

O 2>&1 redireciona tanto a saída padrão quanto a saída de erro. Dessa forma, o processo em segundo plano é executado silenciosamente sem poluir seu terminal.

Você pode verificar se o processo está em execução:

ps aux | grep persistent-task.sh

E você pode examinar o arquivo de saída:

cat persistent-output.log

A saída mostra o horário de início e as iterações da tarefa persistente.

O Comando disown

Outra maneira de manter os processos em execução após o logout é usar o comando disown. Primeiro, execute um processo em segundo plano:

cd ~/project
./persistent-task.sh &

Em seguida, use disown para desvinculá-lo do terminal:

disown %1

Agora este processo continuará em execução mesmo que você feche o terminal.

Esses comandos são essenciais ao executar tarefas em servidores remotos onde você precisa que os processos continuem após a desconexão.

Resumo

Neste laboratório, você aprendeu habilidades essenciais do Linux para gerenciar processos em segundo plano. Você praticou:

  1. Criação e execução de scripts nos modos de primeiro plano e segundo plano
  2. Execução de processos em segundo plano usando o operador &
  3. Verificação do status de processos em segundo plano usando jobs e ps
  4. Gerenciamento de processos com os comandos fg e bg para movê-los entre o primeiro plano e o segundo plano
  5. Terminação de processos em segundo plano usando o comando kill
  6. Execução de processos que continuam após o logout usando nohup e disown

Essas habilidades são fundamentais para trabalhar eficientemente em ambientes Linux, especialmente ao lidar com tarefas de longa duração ou ao trabalhar em servidores remotos. Ao executar processos em segundo plano, você pode maximizar sua produtividade executando várias tarefas simultaneamente sem bloquear sua sessão de terminal.