Matando múltiplos processos

Publicado por Rodrigo 15/04/2008

[ Hits: 8.873 ]

Download mata-processos.sh




Vamos supor que um processo qualquer gere 2.000 instâncias no servidor que dependendo do processo pode ou não sobrecarregar a máquina.

Problema : executar no prompt 2.000 comando de kill.

Claro que matar 2000 processo é inviável. Nem sempre o killall resolve o problema, ainda mais com processos invocados pelos usuários. Esse simples script, recebe como entrada um processo, e busca todos os PIDS, por fim eliminado todos.

O script é bem fácil de entender.  

  



Esconder código-fonte

#/bin/bash

echo "Digite o nome do processo:"
read entrada

ps ax | grep $entrada | cut -f2 -d " " >> mata-processos.txt
LIMIT=$(cat mata-processos.txt | wc -l)
 for ((i=1; i <= $LIMIT ; i++))
 do
   array[i]=$(sed -n "$i p" mata-processos.txt);
   #echo ${array[$i]}
 done

for ((i=1; i <= $LIMIT ; i++))
 do
  echo "Matando processo ${array[$i]}"
  kill -9 ${array[$i]}
 done

 rm mata-processos.txt

Scripts recomendados

Atualização do sistema (Gentoo)

Gravando jogos do XBOX 360

Limpar fila de email

Arrumando tag de arquivos MP3

urlDecoder.sed: Decodificar de URL's


  

Comentários
[1] Comentário enviado por DomingosParaiso em 16/04/2008 - 08:31h

Rodrigo,
Sua idéia é muito boa, alguma coisa não funcionou aqui, na verdade eu percebi que havia um pequeno problema na hora de usar o comando "cut", como o separador é " " ele só pegava os processos que tinham um espaço antes e o número depois, fiz alguns testes e mudei um monte de coisa, estou postando aqui as alterações com comentários.

Valeu

#/bin/bash

# Se nao for passado o nome do processo na linha de
# comando, pede ao usuario para digitar agora
if [ -z "$1" ]; then
# O "-n" e so para ficar na mesma linha =)
echo -n "Digite o nome do processo: "
read FILTRO
echo
else
# se foi passado o nome na linha de comando, manda
# ele para dentro da variavel FILTRO
FILTRO=$1
fi

# O comando ps esta sendo executado com os seguintes parametros:
# -o pid => mostra na saida somente o numero do PID, mais nada (nao precisa filtrar)
# -C ${FILTRO} => filtra todos os processos que tem a linha de comando informada
# --no-headers => nao mostra os cabecalhos na saida do ps
# Tudo isso vai ser enviado para o comando read que vai ler na variavel MATA_PID
# um numero de processo por vez
ps -o pid -C "${FILTRO}" --no-headers | while read MATA_PID; do
# Mostra o processo que vai ser morto
echo "Matando processo ${MATA_PID}"
# Mata o processo, se quiser melhorar ainda mais pode colocar um "&" no final da proxim
# linha, isso vai fazer com que o comando kill seja executado em segundo plano, isso
# significa que ele nao vai ficar esperando matar um processo para depois matar o outro,
# vai matar tudo de uma vez so.
kill -9 ${MATA_PID}
done

[2] Comentário enviado por rodrigofariat em 17/04/2008 - 10:39h

Blz djhook,

Valeu pela implementação.

Att,

Rodrigo Faria


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts