¿Cómo elimino todos los procesos de un usuario usando su UID?

41

Quiero eliminar todos los procesos en ejecución de un usuario en particular desde un script de shell o código nativo en un sistema Linux.

¿Tengo que leer el directorio / proc y buscarlos?

¿Algunas ideas? ¿Existe una asignación dinámica de los pids bajo UID en Linux? ¿No está esto en el proceso?

Si no, ¿dónde se mantiene esta lista? ¿Debería leerlo? Además, ¿dónde está la lista estática de todos los UID en el sistema para poder validar que este usuario existe y luego proceder a eliminar todos los procesos que se ejecutan en él?

usuario489152
fuente
66
¿Desea una herramienta para hacer esto (pkill, slay, otros existen) o desea escribirlo usted mismo? Si es lo primero, el sitio de intercambio de pila de superusuario es probablemente mejor. Si esto último, escanear / procesar y tomar nota de todos los procesos por un usuario específico es el camino a seguir. El código fuente de la utilidad pkill, por ejemplo, muestra cómo hacerlo.
¿Podría aclarar de qué se trata esta pregunta a la luz del comentario de @ LarsWirzenius? ¡Gracias!
Caleb
@Caleb: quería matar procesos leyendo el / proc ya que no conocía ninguna herramienta que lo hiciera. Además, ahora encuentro que, aparte de "kill", "pkill", "skill", etc., no están disponibles en mi sistema. En ese caso, supongo que tengo que buscar alternativas de script de shell para leer / proc y encontrar una manera de obtener procesos bajo un usuario. ¿Algunas ideas?
user489152
1
Con respecto a "la lista estática de todos los UID ... para poder validar esto, este usuario existe": no existe tal cosa como validar una ID de usuario. Los nombres de usuario provienen de una base de datos, pero las ID de usuario son lo que setuid()elija un proceso en ejecución .
Gilles 'SO- deja de ser malvado'

Respuestas:

53

Use pkill -U UIDo pkill -u UIDo nombre de usuario en lugar de UID. A veces skill -u USERNAMEpuede funcionar, otra herramienta es killall -u USERNAME.

La habilidad era específica de Linux y ahora está desactualizada, y pkill es más portátil (Linux, Solaris, BSD).

pkill permite UID numéricos y simbólicos, efectivos y reales http://man7.org/linux/man-pages/man1/pkill.1.html

pkill - ... procesos de señal basados ​​en el nombre y otros atributos

    -u, --euid euid,...
         Only match processes whose effective user ID is listed.
         Either the numerical or symbolical value may be used.
    -U, --uid uid,...
         Only match processes whose real user ID is listed.  Either the
         numerical or symbolical value may be used.

La página de manual de habilidad dice que está permitido usar solo nombre de usuario, no ID de usuario: http://man7.org/linux/man-pages/man1/skill.1.html

skill, snice ... Estas herramientas son obsoletas e inportables. La sintaxis del comando está mal definida. Considere usar el killall, pkill

  -u, --user user
         The next expression is a username.

killall no está marcado como desactualizado en Linux, pero tampoco funcionará con UID numérico; solo nombre de usuario: http://man7.org/linux/man-pages/man1/killall.1.html

killall - elimina procesos por nombre

   -u, --user
         Kill only processes the specified user owns.  Command names
         are optional.

Creo que cualquier utilidad utilizada para encontrar procesos en Linux / Solaris style / proc (procfs) usará una lista completa de procesos (haciendo algunos readdir de /proc). Creo que iterarán sobre /procsubcarpetas digitales y verificarán cada proceso encontrado para encontrar coincidencias.

Para obtener una lista de usuarios, use getpwent(obtendrá un usuario por llamada).

Las herramientas skill (procps & procps-ng) y killall (psmisc) usan la getpwnamllamada a la biblioteca para analizar el argumento de la -uopción, y solo se analizará el nombre de usuario. pkill(procps & procps-ng) usa tanto atol como getpwnam para analizar -u/ -Uargumentar y permitir el especificador de usuario numérico y textual.

osgx
fuente
1
pkill no es obsoleto. Puede no ser portátil fuera de Linux, pero la pregunta era específicamente sobre Linux.
1
para obtener la lista de usuarios, utilice el único revestimiento: getent passwd | awk -F: '{print $ 1}'
Petesh
¿Qué pasa si doy un comando como: "kill -ju UID" de la llamada del sistema C ()?
1
¿Es un Linux incrustado? no tienes habilidad, pkill y killall? Incluso el shell incrustado de busybox tiene pkill y killall.
osgx
2
killall -u USERNAMEtrabajó como encanto
michalzuber
8

Si pasa -1 como argumento de ID de proceso al killcomando de shell o la killfunción C , la señal se envía a todos los procesos que puede alcanzar, lo que en la práctica significa todos los procesos del usuario que ejecuta el killcomando o syscall.

su -c 'kill -TERM -1' bob

En C (error de verificación omitido):

if (fork() == 0) {
    setuid(uid);
    signal(SIGTERM, SIG_DFL);
    kill(-1, SIGTERM);
}
Gilles 'SO- deja de ser malvado'
fuente
5

Si la función pkill no está disponible en su distribución UNIX / Linux, puede ejecutar el siguiente comando como usuario root:

ps -ef | grep username | grep -v grep | awk '{print $2}' | xargs kill

donde nombre de usuario es el usuario cuyos procesos desea eliminar

Comunidad
fuente
o solo el pkill -U username.
osgx
2
pgrep -U username|xargs kill -9
Alejandro
fuente
0

Esto me ha funcionado bien. Puede encontrar todos los pid de los procesos por nombre de usuario haciendo ps U <username>e ir desde allí. Prueba esto:

ps U <username> | cut -d " " -f 1 | xargs kill
jasonrhaas
fuente