GNU/Linux >> Tutoriels Linux >  >> Linux

UNIX / Linux :7 exemples pratiques de commandes PS pour la surveillance des processus

Process est une instance en cours d'exécution d'un programme. Linux est un système d'exploitation multitâche, ce qui signifie que plusieurs processus peuvent être actifs à la fois. Utilisez la commande ps pour savoir quels processus sont en cours d'exécution sur votre système.

Cet article explique 7 utilisations pratiques de la commande ps et de ses options.

Pour surveiller et contrôler les processus, Linux fournit de nombreuses commandes telles que ps, kill, killall, nice, renice et top.

1. Répertorier les processus en cours d'exécution (ps -ef, ps -aux)

C'est un exemple couramment utilisé avec une commande ps pour répertorier tous les processus en cours d'exécution sur une machine. L'exemple suivant montre les options de la commande ps pour obtenir tous les processus.

$ ps -ef
root     26551     5  0 Feb10 ?        00:03:41 [pdflush]
root     26570     5  0 Feb10 ?        00:00:20 [pdflush]
root     30344  3382  0 Feb21 ?        00:00:11 sshd: root@pts/14
root     30365 30344  0 Feb21 pts/14   00:00:02 -bash
root     30393  3382  0 Feb21 ?        00:00:10 sshd: root@pts/15

Où :

  • -e pour afficher tous les processus.
  • -f pour afficher la liste complète.

Dans le cas des machines BSD, vous pouvez utiliser 'ps -aux' qui donnera les détails de tout le processus comme indiqué ci-dessus.

$ ps -aux

2. Répertorier le processus en fonction de l'UID et des commandes (ps -u, ps -C)

Utilisez l'option -u pour afficher le processus qui appartient à un nom d'utilisateur spécifique. Lorsque vous avez plusieurs noms d'utilisateur, séparez-les par une virgule. L'exemple ci-dessous affiche tous les processus appartenant à l'utilisateur wwwrun ou postfix.

$ ps -f -u wwwrun,postfix
UID        PID  PPID  C STIME TTY          TIME CMD
postfix   7457  7435  0 Mar09 ?        00:00:00 qmgr -l -t fifo -u
wwwrun    7495  7491  0 Mar09 ?        00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf
wwwrun    7496  7491  0 Mar09 ?        00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf
wwwrun    7497  7491  0 Mar09 ?        00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf
wwwrun    7498  7491  0 Mar09 ?        00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf
wwwrun    7499  7491  0 Mar09 ?        00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf
wwwrun   10078  7491  0 Mar09 ?        00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf
wwwrun   10082  7491  0 Mar09 ?        00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf
postfix  15677  7435  0 22:23 ?        00:00:00 pickup -l -t fifo -u

Souvent ps est utilisé avec grep comme « ps -aux | commande grep" pour obtenir la liste des processus avec la commande donnée.

Mais la commande ps elle-même a une option pour obtenir la même chose. L'exemple suivant montre que tous les processus qui ont tatad.pl dans son exécution de commande.

$ ps -f -C tatad.pl
UID        PID  PPID  C STIME TTY          TIME CMD
root      9576     1  0 Mar09 ?        00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl
root      9577  9576  0 Mar09 ?        00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl
root      9579  9576  0 Mar09 ?        00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl
root      9580  9576  0 Mar09 ?        00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl
root      9581  9576  0 Mar09 ?        00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl
root      9582  9576  0 Mar09 ?        00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl
root     12133  9576  0 Mar09 ?        00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl

Remarque : Nous pouvons créer des alias pour la commande ps afin de répertorier les processus en fonction des commandes, des utilisateurs ou des groupes.

3. Lister les processus basés sur des PID ou des PPID (ps -p, ps –ppid)

Chaque processus se verra attribuer un ID de processus unique (PID).

Lorsque vous lancez une application, elle peut créer un certain nombre de processus et chaque sous-processus aura son propre PID. Ainsi, chaque processus aura son propre ID de processus et ID de processus parent.

Pour tous les processus qu'un processus bifurque, ils auront le même PPID (identificateur de processus parent). La méthode suivante est utilisée pour obtenir une liste des processus avec un PPID particulier.

$ ps -f --ppid 9576
UID        PID  PPID  C STIME TTY          TIME CMD
root      9577  9576  0 Mar09 ?        00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl
root      9579  9576  0 Mar09 ?        00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl
root      9580  9576  0 Mar09 ?        00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl
root      9581  9576  0 Mar09 ?        00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl
root      9582  9576  0 Mar09 ?        00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl
root     12133  9576  0 Mar09 ?        00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl

L'exemple suivant consiste à lister les processus qui ont donné un PID.

$ ps -f  -p 25009,7258,2426
UID        PID  PPID  C STIME TTY          TIME CMD
root      2426     4  0 Mar09 ?        00:00:00 [reiserfs/0]
root      7258     1  0 Mar09 ?        00:00:00 /usr/sbin/nscd
postfix  25009  7435  0 00:02 ?        00:00:00 pickup -l -t fifo -u

4. Répertorier les processus dans une hiérarchie (ps –forest)

L'exemple ci-dessous affiche l'ID de processus et les commandes dans une hiérarchie. –forest est un argument de la commande ps qui affiche l'art ASCII de l'arborescence des processus. À partir de cet arbre, nous pouvons identifier quel est le processus parent et les processus enfants qu'il a forkés de manière récursive.

$ ps -e -o pid,args --forest
  468  \_ sshd: root@pts/7
  514  |   \_ -bash
17484  \_ sshd: root@pts/11
17513  |   \_ -bash
24004  |       \_ vi ./790310__11117/journal
15513  \_ sshd: root@pts/1
15522  |   \_ -bash
 4280  \_ sshd: root@pts/5
 4302  |   \_ -bash

Remarque : Vous pouvez également utiliser les commandes tree et pstree pour afficher le processus dans une belle structure arborescente.

5. Liste le temps de mur écoulé pour les processus (ps -o pid,etime=)

Si vous souhaitez obtenir le temps écoulé pour les processus en cours d'exécution, la commande ps fournit etime qui fournit le temps écoulé depuis le démarrage du processus, sous la forme [[dd-]hh:]mm:ss.

La commande ci-dessous affiche le temps écoulé pour les ID de processus 1 (init) et l'ID de processus 29675.

Par exemple, "10-22:13:29" dans la sortie représente l'initialisation du processus en cours d'exécution pendant 10 jours, 22 heures, 13 minutes et 29 secondes. Étant donné que le processus d'initialisation démarre au démarrage du système, cette heure sera identique à la sortie de la commande "uptime".

# ps -p 1,29675 -o pid,etime=
  PID
    1 10-22:13:29
29675  1-02:58:46

6. Lister tous les threads pour un processus particulier (ps -L)

Vous pouvez obtenir une liste de threads pour les processus. Lorsqu'un processus se bloque, nous pouvons avoir besoin d'identifier la liste des threads en cours d'exécution pour un processus particulier, comme indiqué ci-dessous.

 $ ps -C java -L -o pid,tid,pcpu,state,nlwp,args
  PID   TID %CPU S NLWP COMMAND
16992 16992  0.0 S   15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006
16992 16993  0.0 S   15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006
16992 16994  0.0 S   15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006
16992 16995  0.0 S   15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006
16992 16996  0.0 S   15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006
16992 16997  0.0 S   15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006
16992 16998  0.0 S   15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006
16992 16999  0.0 S   15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006
16992 17000  0.0 S   15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006
16992 17001  0.0 S   15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006
16992 17002  0.0 S   15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006
16992 17003  0.0 S   15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006
16992 17024  0.0 S   15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006
16992 15753  0.0 S   15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006
16992 15754  0.0 S   15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006

L'option -L est utilisée pour afficher la liste des threads pour un processus qui a la commande donnée. Et il affiche également nlwp, qui représente le nombre de processus légers. Dans l'exemple ci-dessus, un total de 15 threads Java sont en cours d'exécution.

7. Recherche de fuite de mémoire (ps –sort pmem)

Une fuite de mémoire, techniquement, est une utilisation sans cesse croissante de la mémoire par une application.

Avec les applications de bureau courantes, cela peut passer inaperçu, car un processus libère généralement toute la mémoire qu'il a utilisée lorsque vous fermez l'application.

Cependant, dans le modèle client/serveur, la fuite de mémoire est un problème sérieux, car les applications doivent être disponibles 24h/24 et 7j/7. Les applications ne doivent pas continuer à augmenter leur utilisation de la mémoire indéfiniment, car cela peut entraîner de graves problèmes. Pour surveiller ces fuites de mémoire, nous pouvons utiliser les commandes suivantes.

$ ps aux --sort pmem

USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  1520  508 ?        S     2005   1:27 init
inst  1309  0.0  0.4 344308 33048 ?      S     2005   1:55 agnt (idle)
inst  2919  0.0  0.4 345580 37368 ?      S     2005  20:02 agnt (idle)
inst 24594  0.0  0.4 345068 36960 ?      S     2005  15:45 agnt (idle)
root 27645  0.0 14.4 1231288 1183976 ?   S     2005   3:01 /TaskServer/bin/./wrapper-linux-x86-32

Dans la commande ps ci-dessus, l'option –sort génère le %MEM le plus élevé en bas. Notez simplement le PID pour l'utilisation %MEM la plus élevée. Utilisez ensuite la commande ps pour afficher tous les détails de cet identifiant de processus et surveiller l'évolution au fil du temps. Vous deviez le répéter manuellement ou le mettre en tant que cron dans un fichier.

$ ps ev --pid=27645
PID TTY STAT TIME MAJFL TRS DRS RSS %MEM COMMAND
27645 ? S 3:01 0 25 1231262 1183976 14.4 /TaskServer/bin/./wrapper-linux-x86-32

$ ps ev --pid=27645
PID TTY STAT TIME MAJFL TRS DRS RSS %MEM COMMAND
27645 ? S 3:01 0 25 1231262 1183976 14.4 /TaskServer/bin/./wrapper-linux-x86-32

Remarque : Dans la sortie ci-dessus, si RSS (taille de l'ensemble résident, en Ko) augmente avec le temps (comme %MEM), cela peut indiquer une fuite de mémoire dans l'application.

Articles précédents de la série sur la surveillance et le réglage des performances Linux :

  • 10 exemples Sar (Sysstat) utiles pour la surveillance des performances UNIX/Linux
  • Introduction à la surveillance et à l'optimisation des performances de Linux
  • 15 exemples pratiques de commandes principales Linux

Linux
  1. 8 exemples pratiques de la commande Linux Xargs pour les débutants

  2. Commande cp sous Linux :7 exemples pratiques

  3. Commande d'arrêt de Linux :5 exemples pratiques

  4. 5 exemples pratiques de la commande dd sous Linux

  5. UNIX / Linux :10 exemples de commandes Netstat

12 exemples pratiques d'In Command sous Linux

15 exemples pratiques de commande Rsync sous Linux

5 exemples pratiques de la commande Tail sous Linux

commande echo sous Linux :7 exemples pratiques

Commande Ping pratique dans des exemples Linux

15 exemples pratiques de commande Grep sous Linux / UNIX