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:
- Envie um sinal SIGHUP (sinal 1):
pkill -HUP -f signal_handler.sh
- Inicie o script novamente e envie SIGINT (sinal 2):
~/project/signal_handler.sh &
pkill -INT -f signal_handler.sh
- 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.