Terminação de Processos Linux

LinuxBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá habilidades essenciais de gerenciamento de processos Linux, com foco em como identificar e terminar processos. O gerenciamento de processos é uma habilidade fundamental para qualquer usuário ou administrador Linux, pois permite gerenciar os recursos do sistema de forma eficaz.

Você aprenderá a usar o comando ps para identificar os processos em execução e o comando kill para terminá-los quando necessário. Essas ferramentas são essenciais para manter o desempenho do sistema e lidar com aplicações que não respondem.

Ao final deste laboratório, você será capaz de identificar processos, entender seus atributos e terminá-los usando vários métodos. Essas habilidades são valiosas para solucionar problemas e gerenciar sistemas Linux de forma eficiente.

Identificando Processos

No Linux, cada programa ou aplicação em execução é considerado um processo. Cada processo tem um identificador único chamado de ID do Processo (PID - Process ID). Antes de poder terminar um processo, você precisa identificá-lo usando seu PID.

Vamos começar aprendendo como visualizar os processos em execução usando o comando ps. Este comando exibe informações sobre os processos ativos em seu sistema.

Primeiro, abra um terminal no ambiente da VM LabEx e execute o seguinte comando:

ps

Você verá uma lista básica dos processos que estão sendo executados na sua sessão atual do terminal. A saída deve ser semelhante a esta:

  PID TTY          TIME CMD
 2104 pts/0    00:00:00 zsh
 2116 pts/0    00:00:00 ps

Esta saída mostra:

  • PID: O número do ID do Processo
  • TTY: O tipo de terminal em que o processo está sendo executado
  • TIME: A quantidade de tempo de CPU que o processo usou
  • CMD: O comando que iniciou o processo

Para ver uma lista mais abrangente de todos os processos em execução no sistema, use o seguinte comando com opções adicionais:

ps -aux

As opções significam:

  • -a: Mostrar processos de todos os usuários
  • -u: Exibir formato detalhado orientado ao usuário
  • -x: Incluir processos sem um terminal de controle

A saída será muito mais longa e detalhada, mostrando todos os processos em execução no sistema:

USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.1 167936 11876 ?        Ss   10:30   0:01 /sbin/init
root           2  0.0  0.0      0     0 ?        S    10:30   0:00 [kthreadd]
...
labex       2104  0.0  0.1  11108  5456 pts/0    Ss   10:35   0:00 zsh
labex       2130  0.0  0.0   9828  3384 pts/0    R+   10:36   0:00 ps -aux

Agora, vamos criar um processo em segundo plano simples que podemos usar para praticar:

sleep 300 &
sleep_pid=$!

Este comando inicia um processo que irá "dormir" (não fazer nada) por 300 segundos (5 minutos). O símbolo & o executa em segundo plano, e $! captura o PID do processo em segundo plano iniciado mais recentemente.

Vamos verificar se o processo está em execução:

echo "The sleep process ID is: $sleep_pid"
ps | grep sleep

Você deve ver uma saída semelhante a:

The sleep process ID is: 2135
 2135 pts/0    00:00:00 sleep

Agora você sabe como identificar processos e encontrar seus PIDs. No próximo passo, aprenderemos como terminar este processo.

Terminando Processos com 'kill'

Agora que você identificou um processo e seu PID, pode aprender como terminá-lo usando o comando kill. O comando kill envia um sinal para um processo, instruindo-o a terminar.

A sintaxe básica para o comando kill é:

kill [options] <PID>

Vamos terminar o processo sleep que criamos no passo anterior. Armazenamos seu PID na variável $sleep_pid. Use o seguinte comando para terminá-lo:

kill $sleep_pid

Se você esqueceu o PID, pode encontrá-lo novamente usando:

ps | grep sleep

Após executar o comando kill, verifique se o processo foi terminado:

ps | grep sleep

Se o processo foi terminado com sucesso, você não deverá ver nenhuma saída ou apenas o próprio processo grep na saída. Isso significa que o processo sleep não está mais em execução.

Se você quiser ser minucioso, pode usar o comando ps novamente para listar todos os processos:

ps -aux | grep sleep

Isso pode mostrar algo como:

labex       2156  0.0  0.0   7236   720 pts/0    S+   10:40   0:00 grep --color=auto sleep

O único processo mostrado é o próprio comando grep, o que indica que o processo sleep foi terminado.

Por padrão, o comando kill envia um sinal TERM (terminar) para o processo, o que permite que o processo saia graciosamente após realizar quaisquer operações de limpeza. Na maioria dos casos, isso é suficiente para terminar um processo.

Você agora identificou e terminou com sucesso um processo usando o comando kill, que é uma habilidade fundamental para gerenciar processos no Linux.

Entendendo os Sinais do Kill

No Linux, o comando kill pode enviar vários tipos de sinais para os processos, não apenas sinais de terminação. Entender esses sinais oferece mais controle sobre como os processos são terminados.

Primeiro, vamos ver todos os sinais disponíveis executando:

kill -l

Isso listará todos os sinais que o comando kill pode enviar. A saída se parece com:

 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
...

Os sinais mais comumente usados são:

  • SIGTERM (15): Sinal padrão enviado pelo comando kill. Solicita que o processo termine graciosamente.
  • SIGKILL (9): Força o processo a terminar imediatamente. Use quando um processo não responde ao SIGTERM.
  • SIGHUP (1): Tradicionalmente usado para redefinir ou recarregar arquivos de configuração.
  • SIGINT (2): Enviado quando você pressiona Ctrl+C no terminal.

Vamos criar outro processo sleep para praticar:

sleep 300 &
sleep_pid=$!
echo "The new sleep process ID is: $sleep_pid"

Agora, vamos enviar um sinal específico para o processo usando o número do sinal:

kill -15 $sleep_pid

Isso é equivalente ao comando kill padrão, pois envia SIGTERM (sinal 15).

Verifique se o processo foi terminado:

ps | grep sleep

Vamos criar mais um processo sleep para demonstrar o sinal SIGKILL:

sleep 300 &
sleep_pid=$!
echo "The third sleep process ID is: $sleep_pid"

Agora, vamos usar o sinal SIGKILL para terminar à força o processo:

kill -9 $sleep_pid

Verifique se o processo foi terminado:

ps | grep sleep

O sinal SIGKILL (9) é uma opção de "último recurso" porque:

  1. Não permite que o processo faça a limpeza após si mesmo
  2. Pode deixar recursos em um estado inconsistente
  3. Pode causar perda de dados se o processo estiver gravando dados

Sempre tente SIGTERM primeiro e use SIGKILL somente se o processo não estiver respondendo ao SIGTERM.

Gerenciamento Avançado de Processos

O Linux fornece comandos adicionais para gerenciar processos além dos comandos básicos ps e kill. Essas ferramentas oferecem mais flexibilidade e conveniência para identificar e terminar processos.

O Comando pgrep

O comando pgrep permite que você encontre processos por nome, em vez de ter que examinar visualmente a saída de ps:

pgrep sleep

Este comando encontrará todos os processos com "sleep" em seu nome e exibirá seus PIDs.

O Comando pkill

O comando pkill combina a funcionalidade de pgrep e kill - ele encontra processos por nome e envia um sinal para eles:

## Start two sleep processes
sleep 300 &
sleep 300 &

## Kill all sleep processes
pkill sleep

Verifique se todos os processos sleep foram terminados:

ps | grep sleep

O Comando killall

Semelhante ao pkill, o comando killall termina processos por nome:

## Start two more sleep processes
sleep 300 &
sleep 300 &

## Kill all sleep processes
killall sleep

Verifique mais uma vez:

ps | grep sleep

Prioridade de Processo com nice e renice

O Linux também permite que você controle a prioridade dos processos usando os comandos nice e renice.

Vamos iniciar um processo com uma prioridade mais baixa:

nice -n 10 sleep 300 &

O valor nice varia de -20 (maior prioridade) a 19 (menor prioridade). O padrão é 0. Somente o usuário root pode definir valores nice negativos.

Você pode alterar a prioridade de um processo em execução usando renice:

sleep_pid=$!
echo "Sleep process ID with lower priority: $sleep_pid"
renice -n 15 -p $sleep_pid

Vamos verificar a nova prioridade:

ps -o pid,nice,cmd -p $sleep_pid

Finalmente, termine este processo:

kill $sleep_pid

Esses comandos avançados de gerenciamento de processos fornecem maneiras mais eficientes de gerenciar vários processos e controlar os recursos do sistema, o que é especialmente útil em sistemas ocupados ou ao solucionar problemas de desempenho.

Resumo

Neste laboratório, você aprendeu habilidades essenciais de gerenciamento de processos Linux que são valiosas para administração e solução de problemas de sistema:

  1. Identificação de Processos: Você aprendeu a usar o comando ps para listar os processos em execução e encontrar seus IDs de Processo (PIDs).

  2. Terminação de Processos: Você praticou o uso do comando kill para enviar sinais de terminação aos processos usando seus PIDs.

  3. Entendendo os Sinais de Kill: Você explorou diferentes tipos de sinais que podem ser enviados aos processos, incluindo SIGTERM (15) para terminação graciosa e SIGKILL (9) para terminação forçada.

  4. Gerenciamento Avançado de Processos: Você descobriu ferramentas mais poderosas como pgrep, pkill e killall para encontrar e terminar processos por nome, bem como como controlar a prioridade do processo com nice e renice.

Essas habilidades permitem que você:

  • Monitore os processos do sistema de forma eficaz
  • Termine aplicativos que não respondem
  • Gerencie os recursos do sistema
  • Solucione problemas de desempenho

O gerenciamento de processos é um aspecto fundamental da administração de sistemas Linux, e os comandos que você aprendeu neste laboratório são usados diariamente por administradores e usuários Linux para manter o desempenho e a estabilidade do sistema.