mata todos os processos de um usuário, exceto alguns no linux

4

Eu estava executando alguns processos em uma sessão de tela em um servidor remoto. Quando tentei matar todos esses processos:

pkill -U tim

todos os meus processos são mortos, incluindo aqueles que eu não quero matar (isto é, a conexão screen e ssh).

Existe uma maneira de matar todos os meus processos, exceto a conexão screen e ssh?

    
por Tim 30.09.2009 / 19:23

5 respostas

10

Meio hacker:

ps -U tim | egrep -v "ssh|screen" | cut -b11-15 | xargs -t kill

isso eliminará tudo, exceto os processos ssh ou screen. Aqui estão os comandos explicados:

  • ps -U tim - obviamente listará todos os processos a partir do tim do usuário
  • egrep -v "ssh|screen" - removerá linhas com processos ssh ou de tela
  • cut -b11-15 - cortará os dados nas colunas 11-15 (normalmente é onde o PID está localizado
  • xargs -t kill - passará todos os IDs do processo para o comando kill

Você também pode usar o awk, se estiver mais acostumado com isso.

ps -U tim | egrep -v "ssh|screen" | awk '{print $2}' | xargs -t kill
    
por 30.09.2009 / 20:39
1

Nada de que eu saiba. Você poderia criar um script como este:

#!/bin/bash
ps ux | sed -e '/bash/d' -e '/screen/d' | awk '{print $2}' | while read process
do 
  kill $process
done

Se houvesse outros processos que você queria evitar, você precisaria adicionar mais

-e '/processname/d'

entradas para a porção sed. Há provavelmente uma maneira mais limpa de lidar com isso, mas isso vai funcionar.

    
por 30.09.2009 / 20:36
1

Se você está matando muito todos os seus procs, você pode querer investigar por que você precisa fazer isso ... mas, ei, isso é sobre fazer as coisas, não sobre não fazendo coisas.

Uma solução fácil seria usar dois userIDs ... um para a tela e sua conexão SSH, e o outro para todos os processos que você em algum momento desejará eliminar.

Isso está além do "hackerish" e simplesmente "hack", mas tem uma vantagem adicional em que qualquer outro programa que você execute como o usuário "connect" não será morto quando você matar os outros processos. Isso pode incluir "caudas" de logs de erros e coisas do tipo que você pode querer ter deixado por aí.

Espero que isso ajude!

    
por 30.09.2009 / 20:48
1

Tente:

ps aux | grep ^$LOGNAME | egrep -v 'ps aux|-bash|sshd' | awk '{ print $2 }' | xargs kill -9; ps aux | grep $LOGNAME
    
por 22.09.2010 / 16:44
0

Eu usei a abordagem do @RoyRico - não posso comentar esse post por falta de reputação - e o ajustei ao meu sistema. Por causa de alguma configuração diferente, uma não funcionou off-the-shelf.

ps -U myUserName | egrep -v "ssh|screen|grep|bash|systemd|(sd-pam)|ps" | awk '{print $1}' | tail -n +2 | xargs -t kill

Bem, excluí mais processos que eu não queria que fossem mortos. Em segundo lugar, os PIDs vieram na primeira coluna, então o primeiro comando 'cut' estava totalmente errado (como uma solução hacker, algo completamente normal e aceitável;)). Em terceiro lugar, enquanto grep'ing eu tinha um "PID" como uma linha de cabeça que eu excluí usando a cauda.

    
por 09.09.2017 / 15:29