Comment puis-je demander ps
d'afficher uniquement les processus utilisateur et non les threads du noyau?
Voir cette question pour voir ce que je veux dire ...
Comment puis-je demander ps
d'afficher uniquement les processus utilisateur et non les threads du noyau?
Voir cette question pour voir ce que je veux dire ...
Réponses:
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 PPID 0; donc ce work-around.
kthreadd
, puis créez l' ps
appel correspondant. Comment est-il garanti que cette chose sera "toujours" appelée "kthreadd"? Une solution sûre serait plus compliquée, fonctionner ps
normalement et analyser la sortie, faire des tests peut-être.
x
drapeau qui ne fonctionne pas avec ça. ps au --ppid 2 -p 2 --deselect
fonctionne bien.
Une façon de reconnaître les processus du noyau est de ne pas utiliser de mémoire utilisateur. Le champ vsz est donc 0. Cela permet également d'attraper les zombies (grâce à Stéphane Chazelas pour cette observation), qui peuvent être éliminés en fonction de leur statut.
ps axl | awk '$7 != 0 && $10 !~ "Z"'
Pour lister uniquement les PID:
ps -e -o pid= -o state= -o vsize= | awk '$2 != "Z" && $3 != 0 {print $1}'
En pratique, je trouvais assez l'idiome suivant:
ps auxf | grep -v ]$
Il filtre les lignes se terminant par des crochets, ce qui peut entraîner l’omission d’entrées non souhaitées, mais il est très peu probable. En échange, il est assez facile à retenir et relativement rapide à taper.
Certains processus tels que avahi-daemon ajoutent entre parenthèses à leurs noms de processus (le nom d'hôte dans le cas d'avahi-daemon) et seront filtrés par cette commande.
Une des particularités de ces processus est qu'ils ne sont pas sauvegardés par un fichier exécutable, vous pouvez donc le faire ( en 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 qui /proc/<pid>/exe
sont un lien vers un fichier.
Mais cela signifie que vous devez être superutilisateur pour pouvoir vérifier l'état du /proc/<pid>/exe
lien symbolique.
Edit : Au fur et à mesure, les processus zombies remplissent (au moins) la même condition. Si vous ne voulez pas les exclure, vous devrez les rajouter. 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 , -)"
Notez que ps -f
les noms de processus entre crochets ne sont pas attribuables au fait qu’il s’agit de processus de noyau, mais parce qu’ils ont un caractère vide argv[]
(ps affiche donc le nom du processus au lieu d’ argv[0]
ici). Vous pouvez avoir un processus d'espace utilisateur avec un vide argv[]
aussi bien et vous pouvez avoir un nom de processus avec un argv[0]
qui est de la forme [some-string]
afin filtrer la ps
sortie en fonction de ces crochets ne sont pas une option à toute épreuve.
zsh
syntaxe. La seconde est la syntaxe standard POSIX sh
(et ps
et find
et cut
et et paste
). Bien sûr, /proc
n'est pas spécifié par POSIX.
wc -l
). Dans ce cas, je vais accepter la réponse de Hauke Laging et vous donner un avis positif. ;)
Vous pouvez également simplement analyser la ps
sortie et rechercher des noms de processus qui ne sont pas entre crochets:
ps aux | awk '$NF!~/^\[.+\]$/'
awk -F: '$7 ~ home { print $1 }' /etc/passwd
- mais vous obtiendrez tout de même des processus mentionnant un tel nom d'utilisateur et vous laissant le fichier temporaire en suspens. Je retire mon vote négatif, mais uniquement parce que votre troisième solution est raisonnable.
$NF
c'est le dernier mot de la ligne de commande dans la ps aux
sortie. Les processus non-noyau peuvent [...]
y avoir . Comme je l'ai dit dans ma réponse, la [xxx]
notation ne vient pas du fait qu'il s'agit de processus du noyau, mais de l'absence de ligne de commande (pas d'argument), ce qui est également autorisé pour les processus non liés au noyau.
Pour tous ceux qui essayent ceci dans busybox où la configuration ps
est simplifiée et la sortie est différente, cette variante de la réponse géniale 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 consiste à rechercher des processus qui n'utilisent pas de mémoire utilisateur (`vsz col == 0), et à filtrer les processus zombies (le statut du code n'est pas 'Z').
Les colonnes de sortie peuvent être facilement ajustées, à condition que les numéros de champs awk basés sur 1 soient ajustés en conséquence. Voyez les options disponibles pour votre ps en mettant une valeur fictive et elle 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
Si vous n’avez besoin que des comptes ... J’avais le même besoin de filtrer les processus du noyau par rapport aux processus utilisateur, mais je n’avais besoin que des 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]}'
Exemple de sortie :
Kernel processes 353
User processes 52
Total processes 405
Explication : J'utilise le piratage voulant que les processus VSZ = 0 puissent être considérés comme des processus du noyau. Donc avec awk
, j’évalue une comparaison sur VSZ (de ps -eo vsize
), si elle est égale à zéro. Le résultat de la comparaison sera un booléen 0 ou 1. Je crée un tableau p[]
et, au fur et à mesure que je parcours la liste des processus, si c'est un processus du noyau, j'incrémente p[1]++
. Sinon, en tant que processus utilisateur, j'incrémente p[0]++
. Après tout l’incrémentation, j’étiquette et imprime les valeurs (c’est-à-dire les comptes) pour p [0] et p [1] dans le END { }
bloc.
Ce que vous cherchez, mon ami, n’est pas ps
, mais pstree
.
Commencez par identifier le premier processus du noyau. Son PID est généralement 1 sur un 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 ps
commande est qu'elle n'inclut que les enfants directs, mais pas tous les descendants. La pstree
commande inclut tous les descendants. Vous pouvez comparer et compter le résultat de ces deux commandes (un moyen simple à utiliser | wc
) à vérifier.
kthreadd
toujours avoir le PID 2?