Comment puis-je tuer tous les processus d'un utilisateur en utilisant son UID

42

Je veux tuer tous les processus en cours d'exécution d'un utilisateur particulier à partir d'un script shell ou d'un code natif sur un système Linux.

Dois-je lire le répertoire / proc et rechercher ceux-ci?

Des idées? Existe-t-il un mappage dynamique des pids sous les UID sous Linux? N'est-ce pas dans le proc?

Sinon, où cette liste est-elle maintenue? Dois-je lire? De plus, où se trouve la liste statique de tous les UID du système afin que je puisse valider le fait que cet utilisateur existe, puis supprimer tous les processus s’exécutant?

utilisateur489152
la source
6
Voulez-vous un outil pour faire cela (pkill, slay, d'autres existent), ou voulez-vous l'écrire vous-même? Si c'est le cas, le site d'échange de superutilisateurs est probablement meilleur. Si c’est le cas, numériser / proc et noter tous les processus par un utilisateur spécifique est la solution. Le code source de l'utilitaire pkill indiquerait, par exemple, comment procéder.
Pourriez-vous préciser le sujet de cette question à la lumière du commentaire de @ LarsWirzenius? Merci!
Caleb
@Caleb: Je voulais tuer les processus en lisant le fichier / proc car je ne connaissais aucun outil pour le faire. De plus, maintenant, je trouve que les mots "kill", "pkill", "skill", etc. ne sont pas disponibles sur mon système. Dans ce cas, je suppose que je dois examiner des alternatives de script shell pour lire le répertoire / proc et trouver un moyen de faire en sorte que les processus soient gérés par un seul utilisateur. Des idées?
user489152
1
Concernant “la liste statique de tous les UID… pour que je puisse valider que cet utilisateur existe”: la validation d'un ID d'utilisateur n'existe pas. Les noms d'utilisateur proviennent d'une base de données, mais les ID utilisateur sont ceux setuid()choisis par un processus en cours d'exécution .
Gilles 'SO- arrête d'être méchant'

Réponses:

54

Utilisez pkill -U UIDou pkill -u UIDou nom d'utilisateur au lieu de UID. Parfois skill -u USERNAMEpeut fonctionner, un autre outil est killall -u USERNAME.

Skill était spécifique à Linux et est maintenant obsolète, et pkill est plus portable (Linux, Solaris, BSD).

pkill autorise à la fois des UID numériques et symboliques, efficaces et réels http://man7.org/linux/man-pages/man1/pkill.1.html

pkill - ... processus de signal basés sur le nom et d'autres attributs

    -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 page de manuel de l'habileté indique s'il est uniquement autorisé d'utiliser un nom d'utilisateur, et non un identifiant: http://man7.org/linux/man-pages/man1/skill.1.html

compétence, snice ... Ces outils sont obsolètes et impossibles à transporter. La syntaxe de la commande est mal définie. Pensez à utiliser le killall, pkill

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

Killall n'est pas marqué comme étant obsolète sous Linux, mais il ne fonctionnera pas non plus avec l'UID numérique. seul nom d'utilisateur: http://man7.org/linux/man-pages/man1/killall.1.html

killall - tue les processus par leur nom

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

Je pense que tout utilitaire utilisé pour trouver un processus dans le style Linux / Solaris / proc (procfs) utilisera la liste complète des processus (en faisant un readdir de /proc). Je pense qu'ils vont parcourir /procles sous-dossiers numériques et vérifier la correspondance de tous les processus trouvés.

Pour obtenir la liste des utilisateurs, utilisez getpwent(il y aura un utilisateur par appel).

Les outils skill (procps & procps-ng) et killall (psmisc) utilisent l' getpwnamappel de la bibliothèque pour analyser l'argument de l' -uoption, et seul le nom d'utilisateur est analysé. pkill(procps & procps-ng) utilise à la fois atol et getpwnam pour analyser -u/ -Uargument et autoriser le spécificateur d'utilisateur numérique et textuel.

osgx
la source
1
pkill n'est pas obsolète. C'est peut-être unportable en dehors de Linux, mais la question portait spécifiquement sur Linux.
1
pour obtenir la liste des utilisateurs, utilisez la ligne suivante: getent passwd | awk -F: '{print $ 1}'
Petesh
Et si je donnais une commande du type: "kill -ju UID" depuis un appel C system ()?
1
est-ce un linux embarqué? vous n'avez aucune compétence, pkill et killall? Même le shell intégré busybox a pkill et killall.
osgx
2
killall -u USERNAMEa travaillé comme un charme
michalzuber
8

Si vous transmettez -1 en tant qu'argument d'ID de processus à la killcommande shell ou à la killfonction C , le signal est envoyé à tous les processus qu'il peut atteindre, ce qui correspond en pratique à tous les processus de l'utilisateur exécutant la killcommande ou le syscall.

su -c 'kill -TERM -1' bob

En C (vérification d'erreur omise):

if (fork() == 0) {
    setuid(uid);
    signal(SIGTERM, SIG_DFL);
    kill(-1, SIGTERM);
}
Gilles, arrête de faire le mal
la source
5

Si la fonction pkill n'est pas disponible sur votre distribution UNIX / Linux, vous pouvez exécuter la commande suivante en tant qu'utilisateur root:

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

où nom d'utilisateur est l'utilisateur qui est le processus que vous souhaitez supprimer

Communauté
la source
ou juste le pkill -U username.
osgx
2
pgrep -U username|xargs kill -9
Alexandre
la source
0

Cela a bien fonctionné pour moi. Vous pouvez trouver tous les pid des processus par nom d'utilisateur en le faisant ps U <username>et aller de là. Essaye ça:

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