web-dev-qa-db-fra.com

Peut afficher uniquement les processus de non-noyau sur Linux?

Comment puis-je demander ps d'afficher uniquement des processus utilisateur et non des threads de noyau?

Voir - Cette question Pour voir ce que je veux dire ...

42
Totor

Cela devrait faire (sous Linux):

ps --ppid 2 -p 2 --deselect

kthreadd (PID 2) a ppid 0 (sur Linux 2.6 +) mais ps ne permet pas de filtrer pour la PPID 0; Ainsi, ce travail autour.

39
Hauke Laging

Une façon de reconnaître les processus de noyau, c'est qu'ils n'utilisent aucune mémoire d'utilisateur, le champ VSZ est donc égal à 0. Cela attrape également des zombies (grâce à Stéphane Chazelas pour cette observation), qui peut être éliminé à base de sur leur statut.

ps axl | awk '$7 != 0 && $10 !~ "Z"'

Pour énumérer uniquement les PID:

ps -e -o pid= -o state= -o vsize= | awk '$2 != "Z" && $3 != 0 {print $1}'

Une des particularité de ces processus est qu'elles ne sont pas soutenues par un fichier exécutable, vous pourriez donc le faire ( dans ZSH):

ps /proc/[0-9]*/exe(^-@:h:t)

ou avec n'importe quel shell posix :

ps -p "$(find -L /proc/[0-9]*/exe ! -type l | cut -d / -f3 | paste -sd , -)"

C'est vérifier les processus dont /proc/<pid>/exe est un lien vers un fichier.

Mais cela signifie que vous devez être superutilisateur de pouvoir vérifier l'état du /proc/<pid>/exe symbolique.

Edit: Comme cela se produit, les processus zombies (au moins) satisfont à la même condition, donc si vous ne voulez pas qu'ils excluent, vous devez les ajouter. Comme:

ps -p "$(
  { find -L /proc/[0-9]*/exe ! -type l | cut -d / -f3
    ps -Ao pid=,state= | sed -n 's/ Z//p'
  } | paste -sd , -)"

Noter que ps -f montre que ces noms de processus entre crochets ne sont pas parce qu'ils sont des processus de noyau, mais parce qu'ils ont un argv[] (SO PS montre le nom du processus au lieu de argv[0] là). Vous pouvez avoir un processus d'espace utilisateur avec un argv[] aussi et vous pouvez avoir un nom de processus avec un argv[0] c'est de la forme [some-string] Donc, le filtrage de la sortie ps basé sur ces crochets n'est pas une option infaillible.

8

Vous pouvez également simplement analyser la sortie ps et rechercher des noms de processus qui ne sont pas entre crochets:

ps aux | awk '$NF!~/^\[.+\]$/'
1
terdon

Pour toute personne qui essaie cela dans Bupérabox où ps est fortement simplifié et que la sortie est différente, cette variante de la grande réponse de Gilles fonctionne bien:

ps -o pid,user,comm,vsz,stat | awk '$4 != 0 && $5 !~ "Z"'

Selon la réponse de Gilles, la méthodologie ici est de trouver des processus qui n'utilisent aucune mémoire utilisateur (`VSZ Col == 0) et filtrer les processus zombies (Status Col n'est pas" Z ").

Les colonnes de sortie peuvent être réglées facilement, tant que les numéros de champ AWK à base de 1 à 1 fois sont ajustés en conséquence. Voir les options que votre PS est disponible en mettant une valeur de faux et vous le dira. Par exemple:

$ ps -o foo
ps: bad -o argument 'foo', supported arguments: user,group,comm,args,pid,ppid,pgid,tty,vsz,stat,rss
1
Russ

Ce que vous cherchez, mon ami, n'est pas ps, mais pstree.

Tout d'abord, identifiez le premier processus de noyau. Son PID est généralement 1 sur le système sans SystemD et 2 avec SystemD.

Ensuite, utilisez cette commande:

$ pstree -p <1 or 2> | grep -o '([0-9]\+)' | grep -o '[0-9]\+'

La réponse sélectionnée (une avec ✅) utilise une autre commande:

$ ps --ppid 2 -p 2 --deselect

Le problème avec cette commande ps est qu'il n'inclut que les enfants directs mais pas tous les descendants. La commande pstree comprend tous les descendants. Vous pouvez comparer et compter la sortie de ces deux commandes (un moyen simple utilise | wc ) vérifier.

0
ssppjj

Si vous n'avez besoin que du nombre de comptes ... J'avais un besoin similaire à filtrer les processus d'utilisateurs du noyau et des utilisateurs, mais je n'avais que les comptes respectifs de chacun. C'était ma solution:

ps -eo vsize | awk '{p[$1==0]++} END {printf "%-16s %6d\n%-16s %6d\n%-16s %6d\n", "Kernel processes", p[1], "User processes", p[0], "Total processes", p[0]+p[1]}'

Sortie d'échantillon :

Kernel processes    353
User processes       52
Total processes     405

Explication : J'utilise le hack que VSZ = 0 processus peut être supposé être des processus de noyau. Donc, avec awk, j'évalue une comparaison sur VSZ (de ps -eo vsize), si cela équivaut à zéro. Le résultat de la comparaison sera un 0 ou 1. Je fais un tableau p[], et comme je suis tombé dans la liste des processus, s'il s'agit d'un processus de noyau, j'augmente p[1]++. Sinon, en tant que processus d'utilisation, j'y incrément p[0]++. Après tout l'incrémentation, je étiquetez et imprimez les valeurs (c'est-à-dire comptes) pour p [0] et p [1] dans le END { } bloquer.

0
Joshua Huber

J'ai créé PSA Script à cette fin. Notez que cela dépend de l'outil Linechop .

0
Tomáš Pospíšek