Questão matar todos os processos de um usuário, exceto alguns no linux


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

pkill -U tim

todos os meus processos são mortos, incluindo aqueles que eu não quero matar (ou seja, a conexão de tela e ssh).

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


4


origem




Respostas:


Meio hacker:

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

isso matará tudo, menos os processos de ssh ou screen. Aqui estão os comandos explicados:

  • ps -U tim - obviamente listará todos os processos do usuário tim
  • egrep -v "ssh|screen" - removerá linhas com processos ssh ou screen
  • 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

10





Nada construído em que eu esteja ciente. 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 apenas 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.


1





Se você está matando todos os seus processos muito, você pode querer investigar porque você precisa fazer isso ... mas ei, isso é tudo 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 isto ajude!


1



quer dizer ter dois userIDs para o servidor remoto? Apenas curioso, posso criar outro para mim mesmo sem poder mudar para root? - Tim


Experimentar:

ps aux | grep ^$LOGNAME | egrep -v 'ps aux|-bash|sshd' | awk '{ print $2 }' | xargs kill -9; ps aux | grep $LOGNAME

1





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


0