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 ...
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
toujours avoir le PID 2?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, fonctionnerps
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.
Pour lister uniquement les PID:
la source
En pratique, je trouvais assez l'idiome suivant:
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.
la source
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 ):
Ou avec n'importe quel shell POSIX:
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:
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 videargv[]
(ps affiche donc le nom du processus au lieu d’argv[0]
ici). Vous pouvez avoir un processus d'espace utilisateur avec un videargv[]
aussi bien et vous pouvez avoir un nom de processus avec unargv[0]
qui est de la forme[some-string]
afin filtrer laps
sortie en fonction de ces crochets ne sont pas une option à toute épreuve.la source
zsh
syntaxe. La seconde est la syntaxe standard POSIXsh
(etps
etfind
etcut
et etpaste
). 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:la source
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 laps 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: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:
la source
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:
Exemple de sortie :
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 (deps -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 tableaup[]
et, au fur et à mesure que je parcours la liste des processus, si c'est un processus du noyau, j'incrémentep[1]++
. Sinon, en tant que processus utilisateur, j'incrémentep[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 leEND { }
bloc.la source
Ce que vous cherchez, mon ami, n’est pas
ps
, maispstree
.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:
La réponse sélectionnée (une avec) utilise une autre commande:
Le problème avec cette
ps
commande est qu'elle n'inclut que les enfants directs, mais pas tous les descendants. Lapstree
commande inclut tous les descendants. Vous pouvez comparer et compter le résultat de ces deux commandes (un moyen simple à utiliser| wc
) à vérifier.la source
J'ai créé un script psa à cette fin. Notez que cela dépend de l' outil linechop .
la source