Simples e rápido: matando todos os processos de um usuário

Muitas vezes seria necessário que se listassem todos os processos, filtrando o resultado através de um comando como "grep" e, em conjunto com outras ferramentas, como "cut" ou "awk", filtrar apenas o número dos processos correspondentes ao usuário em questão, para somente então executarmos o "kill".

[ Hits: 25.877 ]

Por: Ana Karolina Teixeira de Oliveira em 10/03/2007


Simples e rápido: matando todos os processos de um usuário



Muitas vezes nos deparamos com a seguinte situação:

"Como matar todos os processos de um determinado usuário, de forma simples e rápida?"

Muitas vezes seria necessário que se listassem todos os processos, filtrando o resultado através de um comando como o "grep", e em conjunto com outras ferramentas, como "cut" ou "awk", filtrar apenas o número dos processos correspondentes ao usuário em questão, para somente então executarmos o "kill".

Esta tarefa pode parecer simples, mas toma alguns minutos preciosos, principalmente quando a tarefa que devemos executar exige rapidez e garantia de funcionalidade.

Justamente para não necessitar de verificações muito demoradas e filtragens sobre filtragens nos processos dos usuários, existe o script killuser.sh, desenvolvido com a função de eliminar do sistema (opcionalmente) os processos de um determinado usuário. Suas funcionalidades são:
  • Suporte a processos por usuário;
  • Suporte a processos por usuário e/ou seção (tty) e/ou programa.

Para utilizar o script, siga os passos abaixo:

O script

Copie o script abaixo para um arquivo nomeado como kill_user.sh em seu sistema. Este nome de arquivo pode ser perfeitamente alterado na medida de sua necessidade.

Antes de começarmos, lembrem-se: todas as frases iniciadas pela "#" não são executadas.

#/bin/bash
#
# Script para monitoração de serviço
#
# Procedimentos:
# Este script foi desenvolvido com intuito de facilitar a administração
# de processos do servidor, implementando o recurso de "kill" para os
# processos de um determinado usuário, por sessão (tty) e/ou processo
# específico.
#

# Variáveis do script

KILL="/bin/kill"
PS="/bin/ps"
GREP="/bin/grep"
AWK="/bin/awk"
MORE="/bin/more"

if [ "$1" ];
then
  opc1=$(echo "$1" | $AWK -F'=' '{print $1}')
  opcPar1=$(echo "$1" | $AWK -F'=' '{print $2}')
fi
if [ "$2" ];
then
  opc2=$(echo "$2" | $AWK -F'=' '{print $1}')
  opcPar2=$(echo "$2" | $AWK -F'=' '{print $2}')
fi
if [ "$3" ];
then
  opc3=$(echo "$3" | $AWK -F'=' '{print $1}')   opcPar3=$(echo "$3" | $AWK -F'=' '{print $2}') fi

varOpc=$1
parUsuario=$2
parOpc=$3

# Fazer verificação dos parâmetros recebidos
if [ ! "$1" ];
then
  # Mostrar mensagem de utilização
  echo "kill_user.sh - Utilitário para Gerenciamento de Processos"
  echo -e "\n kill_user.sh é uma ferramenta utilizada para matar os"
  echo "processos de um determinado usuário, em uma determinada sessão, "
  echo "tendo como opcional a seleção de um processo específico."
  echo -e "\nUtilização: kill_user.sh -user=usuario [-tty=tty] [-prog=programa] \n"
  echo -e "Opções: \n"
  echo -e " -user \t - Especifica o usuário para busca de processos (obrigatório)"
  echo -e " -prog \t - Especifica programa da sessão do usuário (opcional)"
  echo -e " -tty \t - Especifica terminal da sessão do usuário (opcional)"
  echo -e "Exemplo:"
  echo -e " $ $0 -user=usuario -tty=tty1 -prog=programa \n"
  exit 1
fi

# Usuário
# Parâmetros recebidos pelo script

if [ "$opc1" -a "$opc1" == "-user" -a "$opcPar1" ];
then
  processos=$($PS aux | $AWK -F' ' '{print $1,$2,$7,$11}' | $GREP ^$opcPar1 | $GREP -v grep)
  parUsuario=$opcPar1
fi

# Programa

if [ "$opc2" -a "$opc2" == "-prog" -a "$opcPar2" ];
then
  if [ "$processos" ];
  then
    processos=$(echo "$processos" | $AWK -F' ' '{print $1,$2,$3,$4}' | $GREP $opcPar2 | $GREP -v grep)
  else
    processos=$($PS aux | $AWK -F' ' '{print $1,$2,$7,$11}' | $GREP $opcPar2 | $GREP -v grep)
  fi
elif [ "$opc2" -a "$opc2" == "-tty" -a "$opcPar2" ];
then
  if [ "$processos" ];
  then
  processos=$(echo "$processos" | $AWK -F' ' '{print $1,$2,$3,$4}' | $GREP $opcPar2 | $GREP -v grep)
  else
  processos=$($PS aux | $AWK -F' ' '{print $1,$2,$7,$11}' | $GREP $opcPar2 | $GREP -v grep)
  fi
fi

# Seção (tty)
if [ "$opc3" -a "$opc3" == "-tty" -a "$opcPar3" ];
then
  if [ "$processos" ];
  then
    processos=$(echo "$processos" | $AWK -F' ' '{print $1,$2,$3,$4}' | $GREP $opcPar3 | $GREP -v grep)
  else
    processos=$($PS aux | $AWK -F' ' '{print $1,$2,$7,$11}' | $GREP $opcPar3 | $GREP -v grep)
  fi
elif [ "$opc3" -a "$opc3" == "-prog" -a "$opcPar3" ];
then
  if [ "$processos" ];
  then
    processos=$(echo "$processos" | $AWK -F' ' '{print $1,$2,$3,$4}' | $GREP $opcPar3 | $GREP -v grep)
  else
  processos=$($PS aux | $AWK -F' ' '{print $1,$2,$7,$11}' | $GREP $opcPar3 | $GREP -v grep)
  fi
fi

# Mostrar listagem de processos encontrados
echo -e "\n--------------------------------------------------------------------------------"
echo -e " Kill User - Gerenciador Simples de processos para sistemas UNIX - Shell Script"
echo -e "--------------------------------------------------------------------------------"
echo -e " Processos encontrados para usuário [$parUsuario]: \n"
echo "$processos" | $AWK -F' ' '{print $2,$3,$4}' | $MORE

echo -e "\n\nConfirme execução ? [s/N]: \c";
read varConfirma

if [ "$varConfirma" == "s" -o "$varConfirma" == "S" ];
then
  # Executar comando
  echo -e "\nProcessos do usuário [$parUsuario] foram cancelados com sucesso!\n"
  pidProcessos=$(echo "$processos" | $AWK -F' ' '{print $2}')
  $KILL -9 $pidProcessos 2> /dev/null
else
  # Mostrar mensagem de aviso
  echo -e "\nProcesso do usuário [$parUsuario] não foram cancelados..."
  echo -e "Você não confirmou a execução!\n"
fi

Configurações

As configurações deste script resumem-se à troca de permissão do script, adicionando permissão de execução, além de certificar-se de que este script está em um diretório exportado no PATH do seu shell do sistema. Para isto, utilize os seguintes comandos, admitindo que o script foi criado em /opt/scripts:

# chmod 755 /opt/scripts/kill_user.sh
# ln -s /opt/scripts/kill_user.sh /usr/bin/kill_user.sh


Pode-se também gravar o arquivo diretamente em um diretório já exportado no PATH do sistema, como: /usr/bin, /usr/local/bin, /bin, etc... ou alterar a variável PATH em /etc/profile.

Agora, basta executar o script seguindo sua sintaxe:

# kill_user.sh kill_user.sh - Utilitário para Gerenciamento de Processos
Desenvolvido por Power Consultoria e Informática Ltda

     kill_user.sh é uma ferramenta utilizada para matar os
processos de um determinado usuário, em uma determinada sessão, tendo como opcional a seleção de um processo específico.

Utilização: kill_user.sh -user=usuario [-tty=tty] [-prog=programa]

Opções:

  -user - Especifica o usuário para busca de processos (obrigatório)
  -prog - Especifica programa da sessão do usuário (opcional)
  -tty - Especifica terminal da sessão do usuário (opcional)
Exemplo:
 $ ./kill_user.sh -user=usuario -tty=tty1 -prog=programa

Referência


Um abraço.

   

Páginas do artigo
   1. Simples e rápido: matando todos os processos de um usuário
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Introdução ao uso de Shell Script

Algoritmos em Shell Script

Pipelines (Canalizadores)

Exemplos práticos de comandos com Parted

Programando em shell script (conceitos básicos)

  
Comentários
[1] Comentário enviado por tiago_herrmann em 10/03/2007 - 15:29h

Olá,

só por questão de informação, de uma olhada no pkill e pgrep.
ex: pkill -u usuario

Talvez uma dica seria tentar enviar SIGTERM no lugar de SIGKILL, e depois de um tempo, para os que não terminarem normalmente, tentar um SIGKILL.
Outra dica seria fazer o parse da linha de comando com getopt.

[2] Comentário enviado por edirlf em 29/07/2007 - 22:09h

normalmente eu uso:

killall -u nome_do_usuario (para matar todos os processos do usuário)

ou

killall -u nome_do_usuario nome_do_processo (para matar determinado processo

Funfa tbm :)

Té mais.

[3] Comentário enviado por vhbsouza em 06/06/2008 - 19:30h

é verdade,,,
até acho mais facil usar o
killall -u nome_do_usuario nome_do_processo
pra matar o processo...
to fazendu isso até com SSH
...

[4] Comentário enviado por removido em 07/10/2008 - 09:21h

pkill -u [nome-do-usuario]
pkill -9 -u [nome-do-usuario]

[5] Comentário enviado por franciane em 02/12/2008 - 14:06h

Boa Tarde amigo, gostei do seu script é o que estou procurando, mas gostaria de saber se você pode me ajudar mas, eu quero colocar este script em um programa chamado openkiosk, no caso quando eu clicar no botão finalizar sessão ele chamar este script limpa a sessão e volta para a tela de login, será q você poderia me dá um help..

bjs

att
franciane

[6] Comentário enviado por franciane em 02/12/2008 - 14:07h

Boa Tarde amigo, gostei do seu script é o que estou procurando, pois ainda não tenho muita experiencia, mas gostaria de saber se você pode me ajudar mas, eu quero colocar este script em um programa chamado openkiosk, no caso quando eu clicar no botão finalizar sessão ele chamar este script limpa a sessão e volta para a tela de login, será q você poderia me dá um help..

bjs

att
franciane

[7] Comentário enviado por m4cgbr em 12/05/2012 - 09:04h

Script está com erro, faltou uma última linha com fechando um "if".

Inserir uma linha com:
fi

Depois disso fiz uns teste e não funcionou, ao menos aqui na minha maquina.

T+



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts