Terminação de Processos Linux Baseada em Padrões

LinuxBeginner
Pratique Agora

Introdução

Em sistemas Linux, o gerenciamento eficaz de processos é crucial para manter a estabilidade e o desempenho do sistema. Embora o comando kill permita a terminação de processos usando um ID de Processo específico (PID), existem situações em que você precisa terminar múltiplos processos com base em padrões. É aqui que o comando pkill se torna inestimável.

Este laboratório foca no uso do comando pkill para terminar processos com base em seus nomes, argumentos ou outros critérios. Você aprenderá como identificar processos em execução, terminá-los seletivamente usando correspondência de padrões e verificar os resultados de suas operações. Essas habilidades são essenciais para a administração e solução de problemas de sistemas em ambientes Linux.

Entendendo o Gerenciamento de Processos e a Terminação Básica

Neste primeiro passo, exploraremos como identificar processos em execução e terminá-los usando correspondência de padrões básica. O Linux fornece vários comandos para gerenciamento de processos, incluindo ps, pgrep e pkill.

Criando Processos de Teste

Vamos começar criando um script simples que podemos executar como um processo em segundo plano. Criaremos múltiplas instâncias deste script para simular um cenário em que você precisa terminar vários processos semelhantes.

Primeiro, navegue até o diretório do projeto e crie um script chamado rogue_app.sh:

cd ~/project
nano rogue_app.sh

Adicione o seguinte conteúdo ao script:

#!/bin/bash
while true; do
  echo "Process running with PID $$"
  sleep 5
done

Este script executa um loop infinito, imprimindo seu ID de Processo (PID) a cada 5 segundos.

Agora, torne o script executável:

chmod +x ~/project/rogue_app.sh

Vamos executar múltiplas instâncias deste script em segundo plano:

for i in {1..5}; do
  ~/project/rogue_app.sh &
done

O & no final do comando executa cada instância do script em segundo plano, permitindo que você continue usando o terminal.

Visualizando Processos em Execução

Para ver os processos que você acabou de iniciar, use o comando ps com as flags apropriadas:

ps aux | grep rogue_app.sh

A saída será semelhante a esta:

labex     12345  0.0  0.0   2308   580 pts/0    S    10:00   0:00 /bin/bash /home/labex/project/rogue_app.sh
labex     12346  0.0  0.0   2308   580 pts/0    S    10:00   0:00 /bin/bash /home/labex/project/rogue_app.sh
labex     12347  0.0  0.0   2308   580 pts/0    S    10:00   0:00 /bin/bash /home/labex/project/rogue_app.sh
labex     12348  0.0  0.0   2308   580 pts/0    S    10:00   0:00 /bin/bash /home/labex/project/rogue_app.sh
labex     12349  0.0  0.0   2308   580 pts/0    S    10:00   0:00 /bin/bash /home/labex/project/rogue_app.sh
labex     12350  0.0  0.0   2432   584 pts/0    S+   10:00   0:00 grep --color=auto rogue_app.sh

Observe que os PIDs reais (os números na segunda coluna) serão diferentes no seu sistema.

Terminando Processos com pkill

Agora, vamos usar o comando pkill para terminar todas as instâncias do nosso script:

pkill -f rogue_app.sh

A opção -f diz ao pkill para corresponder à linha de comando completa, não apenas ao nome do processo. Isso é importante porque, quando um script é executado, o nome do processo é frequentemente o interpretador (como /bin/bash) em vez do nome do script.

Verifique se todas as instâncias do script foram terminadas:

ps aux | grep rogue_app.sh

Você agora deve ver apenas o próprio comando grep na saída:

labex     12351  0.0  0.0   2432   584 pts/0    S+   10:01   0:00 grep --color=auto rogue_app.sh

Isso confirma que todas as instâncias de rogue_app.sh foram terminadas com sucesso.

Terminação Seletiva de Processos com Correspondência de Padrões

Em cenários do mundo real, você frequentemente precisa ser mais seletivo sobre quais processos terminar. O comando pkill permite que você use correspondência de padrões para direcionar processos específicos com base em vários critérios.

Criando Processos com Diferentes Argumentos

Vamos criar um novo script que executaremos com diferentes argumentos de linha de comando:

cd ~/project
nano service_worker.sh

Adicione o seguinte conteúdo ao script:

#!/bin/bash
while true; do
  echo "Running service worker with argument: $1"
  sleep 5
done

Torne o script executável:

chmod +x ~/project/service_worker.sh

Agora, vamos executar múltiplas instâncias deste script com diferentes argumentos:

~/project/service_worker.sh normal &
~/project/service_worker.sh normal &
~/project/service_worker.sh --malfunctioning &
~/project/service_worker.sh --malfunctioning &
~/project/service_worker.sh emergency &

Isso cria cinco processos em segundo plano: dois trabalhadores "normais", dois trabalhadores "com defeito" e um trabalhador "emergencial".

Visualizando Processos com Diferentes Argumentos

Verifique os processos em execução:

ps aux | grep service_worker.sh

Você deve ver uma saída semelhante a:

labex     12360  0.0  0.0   2308   580 pts/0    S    10:05   0:00 /bin/bash /home/labex/project/service_worker.sh normal
labex     12361  0.0  0.0   2308   580 pts/0    S    10:05   0:00 /bin/bash /home/labex/project/service_worker.sh normal
labex     12362  0.0  0.0   2308   580 pts/0    S    10:05   0:00 /bin/bash /home/labex/project/service_worker.sh --malfunctioning
labex     12363  0.0  0.0   2308   580 pts/0    S    10:05   0:00 /bin/bash /home/labex/project/service_worker.sh --malfunctioning
labex     12364  0.0  0.0   2308   580 pts/0    S    10:05   0:00 /bin/bash /home/labex/project/service_worker.sh emergency
labex     12365  0.0  0.0   2432   584 pts/0    S+   10:05   0:00 grep --color=auto service_worker.sh

Terminação Seletiva com Correspondência de Padrões

Agora, vamos terminar seletivamente apenas os processos com o argumento --malfunctioning:

pkill -f "service_worker.sh --malfunctioning"

A opção -f garante que pkill corresponda à linha de comando completa, incluindo os argumentos.

Verifique se apenas os processos direcionados foram terminados:

ps aux | grep service_worker.sh

Você agora deve ver apenas os processos "normal" e "emergency":

labex     12360  0.0  0.0   2308   580 pts/0    S    10:05   0:00 /bin/bash /home/labex/project/service_worker.sh normal
labex     12361  0.0  0.0   2308   580 pts/0    S    10:05   0:00 /bin/bash /home/labex/project/service_worker.sh normal
labex     12364  0.0  0.0   2308   580 pts/0    S    10:05   0:00 /bin/bash /home/labex/project/service_worker.sh emergency
labex     12366  0.0  0.0   2432   584 pts/0    S+   10:06   0:00 grep --color=auto service_worker.sh

Isso demonstra como você pode terminar seletivamente processos com base em padrões específicos em suas linhas de comando.

Vamos agora terminar todos os processos de trabalho de serviço restantes:

pkill -f service_worker.sh

Verifique se todos os processos de trabalho de serviço foram terminados:

ps aux | grep service_worker.sh

Você agora deve ver apenas o próprio comando grep:

labex     12367  0.0  0.0   2432   584 pts/0    S+   10:07   0:00 grep --color=auto service_worker.sh

Opções Avançadas de Terminação de Processos

Nesta etapa, exploraremos algumas opções avançadas do comando pkill que permitem um gerenciamento de processos mais sofisticado.

Usando Diferentes Tipos de Sinal

Por padrão, pkill envia o sinal SIGTERM (sinal 15) para os processos. Este sinal permite que os processos terminem de forma graciosa, fechando arquivos e realizando operações de limpeza. No entanto, há casos em que você pode querer usar um sinal diferente.

Vamos criar um script que lida com sinais:

cd ~/project
nano signal_handler.sh

Adicione o seguinte conteúdo ao script:

#!/bin/bash
trap 'echo "Received SIGHUP (1)"; exit 0' SIGHUP
trap 'echo "Received SIGINT (2)"; exit 0' SIGINT
trap 'echo "Received SIGTERM (15)"; exit 0' SIGTERM

echo "Process started with PID $$"
echo "Use: pkill -[signal] -f signal_handler.sh to send signals"
while true; do
  sleep 1
done

Torne o script executável:

chmod +x ~/project/signal_handler.sh

Execute o script em segundo plano:

~/project/signal_handler.sh &

Agora, vamos tentar enviar sinais diferentes para o processo:

  1. Envie um sinal SIGHUP (sinal 1):
pkill -HUP -f signal_handler.sh
  1. Inicie o script novamente e envie SIGINT (sinal 2):
~/project/signal_handler.sh &
pkill -INT -f signal_handler.sh
  1. Inicie o script novamente e envie o SIGTERM padrão (sinal 15):
~/project/signal_handler.sh &
pkill -f signal_handler.sh ## Default is SIGTERM

Para cada sinal, você deverá ver a mensagem correspondente na saída do terminal antes que o processo seja encerrado.

Terminando Processos por Idade

pkill permite que você mire em processos com base em sua idade usando a opção --newest, que seleciona os processos iniciados mais recentemente.

Vamos criar alguns processos com tempos de início diferentes:

cd ~/project
nano age_test.sh

Adicione o seguinte conteúdo ao script:

#!/bin/bash
while true; do
  echo "Process running with PID $$"
  sleep 5
done

Torne o script executável:

chmod +x ~/project/age_test.sh

Inicie o primeiro processo:

~/project/age_test.sh &

Espere alguns segundos e, em seguida, inicie mais dois processos:

sleep 5
~/project/age_test.sh &
~/project/age_test.sh &

Agora, vamos terminar apenas os dois processos iniciados mais recentemente usando a opção --newest:

pkill -f --newest 2 age_test.sh

Verifique quais processos ainda estão em execução:

ps aux | grep age_test.sh

Você deverá ver apenas o primeiro processo ainda em execução, pois ele foi iniciado antes dos outros dois processos.

Termine o processo restante:

pkill -f age_test.sh

Limitando pkill pelo Proprietário do Processo

Você também pode limitar as ações do pkill a processos de propriedade de um usuário específico. Em um sistema multiusuário, isso é particularmente útil.

Para fins de demonstração, vamos executar alguns processos como o usuário atual:

~/project/rogue_app.sh &
~/project/rogue_app.sh &

Agora, vamos terminar esses processos, mas apenas aqueles de propriedade do seu usuário atual:

pkill -f -u $(whoami) rogue_app.sh

A opção -u especifica o nome de usuário do proprietário do processo. A substituição de comando $(whoami) obtém seu nome de usuário atual.

Verifique se todos os processos foram terminados:

ps aux | grep rogue_app.sh

Você deverá ver apenas o comando grep em si na saída.

Esta capacidade de direcionar processos por proprietário é particularmente útil em ambientes multiusuário onde você deseja evitar afetar processos pertencentes a outros usuários.

Resumo

Neste laboratório, você aprendeu como usar o comando pkill para gerenciar processos em um ambiente Linux. Este comando poderoso permite que você termine processos com base em vários critérios, tornando-o uma ferramenta essencial para a administração do sistema.

Conceitos-chave abordados:

  1. Terminação Básica de Processos: Você aprendeu como identificar processos em execução usando o comando ps e terminá-los usando pkill com correspondência de padrões básica.

  2. Terminação Seletiva de Processos: Você explorou como usar a correspondência de padrões para direcionar seletivamente processos com base em seus argumentos de linha de comando, permitindo um controle preciso sobre quais processos terminar.

  3. Opções Avançadas de Terminação de Processos: Você descobriu opções avançadas do pkill, incluindo como:

    • Enviar diferentes tipos de sinal para processos
    • Terminar processos com base em sua idade
    • Limitar o escopo do pkill a processos pertencentes a um usuário específico

Essas habilidades são valiosas para manter a estabilidade do sistema, gerenciar recursos e solucionar problemas em ambientes Linux. Ao dominar o comando pkill, você adicionou uma ferramenta importante ao seu kit de ferramentas de administração de sistemas Linux.