Comment compter le nombre de processus en veille à l'aide d'un script Shell?
Explication détaillée ... vous confiant de tout prendre en charge puisque c'est votre devoir ...
Lister les processus avec la commande ps
$ ps
PID TTY TIME CMD
4879 pts/3 00:00:00 bash
5003 pts/3 00:00:00 ps
Oh, cela ne montre que les processus de la session en cours. Nous voulons montrer tous les processus du système. Pour cela, nous pouvons utiliser le drapeau -e
$ ps -e
PID TTY TIME CMD
1 ? 00:00:05 systemd
2 ? 00:00:00 kthreadd
3 ? 00:00:00 ksoftirqd/0
[and many more lines]
mais comment montrer quels sont ceux qui dorment?
Vous pouvez utiliser l'option -l
ou u
. Cela donne plus de détails, y compris l'état du processus. Les processus en veille ont une lettre S
ou D
dans la colonne STAT
de man ps
CODES D'ÉTAT DE PROCESSUS Voici les différentes valeurs que les spécificateurs de sortie s, stat et state (en-tête "STAT" ou "S") afficheront pour décrire l'état d'un processus:
D uninterruptible sleep (usually IO) R running or runnable (on run queue) S interruptible sleep (waiting for an event to complete) T stopped by job control signal t stopped by debugger during the tracing W paging (not valid since the 2.6.xx kernel) X dead (should never be seen) Z defunct ("zombie") process, terminated but not reaped by its parent
Nous pouvons formater la sortie ps
pour afficher UNIQUEMENT les états, afin de faciliter leur comptage:
ps -e -o state
ici, nous utilisons -e
pour obtenir tous les processus et l'indicateur -o
, suivi du type de sortie que nous voulons. Cette commande affiche uniquement la lettre d'état. Nous pouvons ensuite diriger (en utilisant |
) cette sortie vers grep
pour compter les lignes avec S
ou D
, les processus en veille:
ps -e -o state | grep -cE 'S|D'
grep
recherche du texte. L'option -c
lui indique de ne compter que les correspondances au lieu d'afficher le texte trouvé. L'option -E
indique à grep
d'utiliser une expression rationnelle étendue, de sorte que nous puissions utiliser les caractères |
pour faire correspondre l'objet OR à l'aide de l'expression: thing|stuff
. . Lorsque vous utilisez regex, utilisez des guillemets simples pour empêcher les extensions du shell.
Très facile si vous savez que la commande ps
affiche le statut des processus en veille sous la forme S
pour le sommeil interruptible et D
pour le sommeil ininterruptible. Vous pouvez également utiliser le drapeau -o s
pour rechercher le état de ceux-ci. Maintenant, tout ce que vous avez à faire est d’exécuter la sortie avec grep
qui comptera les occurrences de ces drapeaux. Ainsi:
$ ps -e -o s | grep -o 'S\|D' -c
260
Une autre méthode consiste à répertorier le nombre de processus dans chaque état en utilisant:
$ ps -e -o state | sort | uniq -c
1 R
141 S
L'utilitaire top
indique le nombre de tâches, indiquant le nombre de tâches en cours d'exécution et le nombre de tâches en veille. Bien sûr, cela change moment par moment, mais la production de l'un de ces one-liners également. Comme avec tout utilitaire * nix, la page man
donnera plus de détails.