web-dev-qa-db-fra.com

Comment tuer tous les processus d'un utilisateur à l'aide de son UID

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 les rechercher?

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 conservée? Dois-je en lire? Où se trouve également la liste statique de tous les UID du système afin que je puisse valider l'existence de cet utilisateur, puis procéder à la suppression de tous les processus en cours d'exécution?

45
user489152

Utilisation pkill -U UID ou pkill -u UID ou nom d'utilisateur au lieu de l'UID. Quelquefois skill -u USERNAME peut fonctionner, un autre outil est killall -u USERNAME .

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

pkill autorise les 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 compétence indique qu'il est uniquement autorisé d'utiliser le nom d'utilisateur, pas l'ID utilisateur: http://man7.org/linux/man-pages/man1/skill.1.html

compétence, snice ... Ces outils sont obsolètes et non transférables. La syntaxe de 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 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 - tuer 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 des processus dans le style/proc de Linux/Solaris (procfs) utilisera la liste complète des processus (faisant un readdir de /proc). Je pense qu'ils vont parcourir /proc les sous-dossiers numériques et vérifier la correspondance de tous les processus trouvés.

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

compétence (procps & procps-ng) et killall (psmisc) utilisent tous deux les outils getpwnam appel de bibliothèque pour analyser l'argument de -u option, et seul le nom d'utilisateur sera analysé. pkill (procps & procps-ng) tilise à la fois atol et getpwnam pour analyser -u/-U argument et autorise les spécificateurs utilisateur numériques et textuels.

60
osgx

Si vous passez -1 comme argument d'ID de processus à la commande kill Shell ou fonction kill C , le signal est envoyé à tous les processus qu'il peut atteindre, ce qui signifie en pratique tous les processus de l'utilisateur exécutant la commande kill ou 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);
}

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 dont vous souhaitez supprimer les processus

5
David
pgrep -U username|xargs kill -9
1
Alexander

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

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