Linux slogan
Visite também: Segurança Linux · BR-Linux.org · Dicas-L · Doode · NoticiasLinux · SoftwareLivre.org · UnderLinux



» Screenshot
Linux: Fedora 6
Por asilva
» Login
Login:
Senha:

Se você ainda não possui uma conta, clique aqui.

Esqueci minha senha



Artigo

Simples e rápido: matando todos os processos de um usuário
Linux user
anakoliveira
10/03/2007
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".
Por: Ana Karolina Teixeira de Oliveira
[ Hits: 15767 ]
Conceito: 10.0   1 voto(s)1 voto(s)1 voto(s)1 voto(s)1 voto(s) + quero dar nota ao artigo

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

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 macgbr 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


  
Para executar esta ação você precisa estar logado no site, caso contrário, tudo o que for digitado será perdido.
Responsável pelo site: Fábio Berbert de Paula - Conteúdo distribuído sob licença GNU FDL
Site hospedado por:

Viva o Linux

A maior comunidade Linux da América Latina! Artigos, dicas, tutoriais, fórum, scripts e muito mais. Ideal para quem busca auto-ajuda em Linux.