matar todos los procesos de un usuario, excepto algunos en Linux

6

Estaba ejecutando algunos procesos en una sesión de pantalla en un servidor remoto. Cuando intenté matar todos esos procesos:

pkill -U tim

todos mis procesos se eliminan, incluidos los que no quiero matar (es decir, la pantalla y la conexión ssh).

¿Hay alguna forma de eliminar todos mis procesos excepto la pantalla y la conexión ssh?

Tim
fuente

Respuestas:

12

Un poco hacker:

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

esto matará todo menos cualquier proceso ssh o de pantalla. Aquí están los comandos explicados:

  • ps -U tim - obviamente, enumerará todos los procesos del usuario tim
  • egrep -v "ssh|screen" - eliminará líneas con ssh o procesos de pantalla
  • cut -b11-15 - cortará los datos en las columnas 11-15 (generalmente ahí es donde se encuentra el PID
  • xargs -t kill - Pasará todas las ID del proceso al comando kill

También puedes usar awk, si estás más acostumbrado a eso.

ps -U tim | egrep -v "ssh|screen" | awk '{print $2}' | xargs -t kill
Roy Rico
fuente
2

Nada construido en eso que yo sepa. Podrías crear un script como este:

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

Si hubiera otros procesos que quisiera evitar matar, solo necesitaría agregar más

-e '/processname/d'

entradas a la porción sed. Probablemente haya una forma más limpia de manejarlo, pero esto funcionará.

djhowell
fuente
Si. Puede agregar -e '/ login / d' y eliminar -e '/ bash / d'. Entonces incluso puedes volver a montar el FS raíz como RO. Me refiero a mayúsculas y minúsculas, cuando estás en un terminal raíz que no es X11. PD: Si estás en X11, cierra sesión primero.
user1742529
1

Si está matando mucho a todos sus procs, es posible que desee investigar por qué necesita hacer eso ... pero bueno, esto se trata de hacer cosas, no de no hacer cosas.

Una solución fácil sería usar dos ID de usuario ... uno para la pantalla y su conexión SSH, y el otro para todos los procesos que en algún momento querrá eliminar.

Esto va más allá del "pirateo informático" y del simple "pirateo", pero tiene una ventaja adicional en que cualquier OTRO programa que ejecute como usuario "conectado" no será asesinado cuando elimine los otros procesos. Esto podría incluir "colas" de registros de errores y cosas por el estilo que tal vez QUIERAS haber dejado.

¡Espero que esto ayude!

pbr
fuente
¿te refieres a tener dos ID de usuario para el servidor remoto? Por curiosidad, ¿puedo crear otro para mí sin poder cambiar a root?
Tim
1

Tratar:

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

Utilicé el enfoque de @RoyRico, no puedo comentar sobre esa publicación por falta de reputación, y lo ajusté a mi sistema. Debido a alguna configuración diferente, esa no funcionó de fábrica.

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

Bueno, excluí más procesos que no quería haber matado. En segundo lugar, los PID aparecieron en la primera columna, por lo que el antiguo comando 'cortar' estaba totalmente en una posición incorrecta (como solución de piratería, algo completamente normal y aceptable;)). Tercero, mientras grep'ing tenía un "PID" como línea principal que excluí al usar la cola.

mkastner
fuente
0

Para agregar a las respuestas existentes, lo siguiente funcionó para mí.

  • El PID aparece en la primera columna de mi máquina, por lo tanto, b1-6
  • Al igual que otro póster, incluí los nombres de los procesos utilizados en el comando que, de lo contrario, podrían recogerse en el comando kill.
  • Incluya PID en la lista de ignorados para eliminar el título
  • La inclusión --no-run-if-emptyde la xargsopción suprime la escritura de la ayuda en la pantalla si xargstermina en blanco, es decir. No se encontraron procesos.
  • Si coloca esto en un script bash, ¡incluya también bashel nombre del script bash en la lista de comandos ignorados!

    ps -U myUserName | egrep -v "ssh|screen|PID|ps|grep|cut|xargs|kill" | cut -b1-6 | xargs -t --no-run-if-empty kill

David
fuente