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?
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.
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
pgrep -U username|xargs kill -9
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