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