Maintenance des applications
Introduction
Les différents types de dysfonctionnement d’une application peuvent être répertoriés ainsi :
-
application qui ne s’exécute pas,
-
application qui ne répond pas,
-
application avec un fonctionnement dégradé,
-
application avec des comportements inattendus.
Application ne s’exécutant pas
Pour diagnostiquer une application qui échoue au démarrage, examinez les éléments suivants :
-
la description du paquet DEB ou RPM qui est à l’origine de l’installation du programme. Dans le cas où le programme a été compilé par vos soins, consultez dans ce cas les paramètres de compilation ;
-
les fichiers de configuration ;
-
les journaux d’événements ;
-
les filtrages réseau ;
-
les dépendances nécessaires ;
-
l’emplacement des bibliothèques ;
-
l’exécution de l’application en mode débogage (debug).
1. Description d’un paquet installé
La commande varie d’une distribution à l’autre :
Debian
Commencez par afficher la description du paquet concerné avec la commande apt-cache show.
Syntaxe
apt-cache show <nom_du_paquet>
Pas d’options pour cette commande.
Exemple avec Debian
Afficher la description du programme Apache 2 :
root@system1:~# apt-cache show apache2
Package: apache2
Version: 2.4.25-3+deb9u5
Installed-Size: 578
Maintainer: Debian Apache Maintainers <debian-apache@lists.debian.org>
Architecture: amd64
Replaces: apache2.2-bin, apache2.2-common
Provides: httpd, httpd-cgi
Depends: init-system-helpers (>= 1.18~), lsb-base, procps, perl,
mime-support, apache2-bin (= 2.4.25-3+deb9u5), apache2-utils
(= 2.4.25-3+deb9u5), apache2-data (= 2.4.25-3+deb9u5), perl:any
Pre-Depends: dpkg (>= 1.17.14)
Recommends: ssl-cert
Suggests: www-browser, apache2-doc, apache2-suexec-pristine |
apache2-suexec-custom
Conflicts: apache2.2-bin, apache2.2-common
Description-fr: Serveur HTTP Apache
L'objectif du projet Apache de serveur HTTP est de construire un
serveur HTTP sécurisé, performant et extensible comme un logiciel
respectant les normes open source. Le résultat a longtemps été le
serveur web numéro un sur Internet. L'installation de ce paquet
provoque une installation complète, y compris des fichiers de
configuration, des scripts d'initialisation et de prise en charge.
Description-md5: d02426bc360345e5acd45367716dc35c
Homepage: http://httpd.apache.org/
Tag: role::metapackage, suite::apache
Section: httpd ...
Application ne répondant pas
1. Mode débogage
Si une application ne répond pas, elle peut attendre par exemple une connexion réseau. Vous pouvez rattacher la commande strace à ce processus.
Syntaxe
strace <programme>
Option nécessaire :
Option courte |
Description |
-p <pid> |
Trace le processus mentionné par son PID. |
Exemple avec Debian
Pour tracer le processus de Apache 2, il faut connaître son PID :
root@system1:~# pidof apache2
4995 4994 4991
ou bien :
root@system1:~# ps ax | grep apache2 |grep -v grep
4991 ? Ss 0:00 /usr/sbin/apache2 -k start
4994 ? Sl 0:00 /usr/sbin/apache2 -k start
4995 ? Sl 0:00 /usr/sbin/apache2 -k start
Apache retourne plusieurs PID. Prenez la dernière valeur :
root@system1:~# strace -p 4991
Process 4991 attached
select(0, NULL, NULL, NULL, {0, 549301}) = 0 (Timeout)
wait4(-1, 0x7ffef5b4643c, WNOHANG|WSTOPPED, NULL) = 0
select(0, NULL, NULL, NULL, {1, 0}) = 0 (Timeout)
wait4(-1, 0x7ffef5b4643c, WNOHANG|WSTOPPED, NULL) = 0
select(0, NULL, NULL, NULL, {1, 0}) = 0 (Timeout)
wait4(-1, 0x7ffef5b4643c, WNOHANG|WSTOPPED, NULL) = 0
*** Sortie tronquée ***
Faites [CTRL]+C pour interrompre.
2. Terminer un processus
Vous pouvez demander au système d’exploitation de terminer un processus ayant un comportement anormal ou qui est planté en invoquant son identifiant de processus (PID) ou bien son nom.
a. Rechercher un PID
Vous pouvez rechercher le PID d’une application qui ne répond plus avec les commandes suivantes :
-
pidof
-
pgrep
-
ps
pidof
Cette commande affiche le ou les PID du programme invoqué.
Syntaxe
pidof <option> <nom_du_programme
Option utile :
Option courte |
Description |
-s |
Renvoie un seul PID. |
Exemple
Connaître les PID du programme ssh :
root@system1:~# pidof sshd
3610 3605 3423
pgrep
La commande pgrep affiche les identifiants des processus.
Syntaxe
pgrep <options> <nom_du_programme>
Options nécessaires :
Option |
Description |
|
courte |
longue |
|
-l |
--list-name |
Affiche le processus avec son PID. |
-u <utilisateur> |
--euid <utilisateur> |
Affiche les processus de l’UID mentionné.... |
Fonctionnement dégradé
Si l’application offre une faible performance, il est utile de connaître avant tout son mode de fonctionnement normal. Il existe forcément une raison légitime de ce changement de performance. Autrement, une activité illicite ou malicieuse serait cachée.
Dans le tableau ci-dessous, vous trouverez des raisons probables de ce dysfonctionnement :
Cause |
Solution |
Le CPU est insuffisant. |
Mettre un CPU plus puissant. |
Le CPU est trop sollicité par des processus. |
Répartir les applications sur d’autres CPU ou déplacer des applications. |
L’utilisation de l’application a fortement augmenté donc elle prend plus de ressources. |
Optimiser (tuning) la configuration de l’application. |
Le chapitre Analyse des performances - Processeur propose des outils pour diagnostiquer l’activité CPU.
Comportements inattendus
Comme pour un fonctionnement dégradé, il est utile de connaître le mode de fonctionnement normal de l’application concernée.
Si l’application n’a pas un fonctionnement normal mais au contraire se comporte bizarrement, vous devez identifier la raison légitime de ce changement de comportement. Ce problème est-il survenu après une mise à jour ? Et quels sont les éléments impactés ?
1. Supprimer les zombies
Un processus zombie est un processus qui a été lancé par un processus parent et qui s’est terminé sans que le processus père ne soit mis au courant. Le système a vidé la mémoire et les ressources utilisées par le processus zombie. La table des processus garde cependant une trace de celui-ci jusqu’au moment où le processus parent demandera au système d’exploitation l’état de son processus fils. C’est alors que le processus zombie disparaîtra.
Trop de processus zombies provoque un gaspillage énorme de ressources et peut amener à ne plus pouvoir lancer de nouveaux programmes puisque le nombre de processus est limité au sein du système.
Vous pouvez identifier le nombre maximal de processus qui est 32768 ainsi :
root@system1:~# cat /proc/sys/kernel/pid_max
32768
Pour éviter ce genre de situation, tout processus bien écrit ne devrait pas créer de zombie et par extension, il n’est donc pas normal d’en trouver.
Pour supprimer un zombie, vous devez terminer l’exécution de son père. Ce qui peut engendrer l’arrêt d’une application nécessaire à l’exploitation.
Pour vérifier l’état des processus, utilisez la commande ps.
Syntaxe
ps <options>
Options nécessaires :
Option courte |
Description |
-a |
Affiche tous les processus. |
-u |
Affiche l’utilisateur propriétaire du processus. |
-x |
Affiche également les processus qui n’ont pas de terminal de contrôle. |
Exemple
root@system1:~# ps aux | grep Z
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
bob 7294 0.0 0.0 0 0 pts/9 Z 20:47 0:00 [08_zombie] <defunct>
bob 7282...
Exercices
Pour les deux exercices, vous allez utiliser la machine virtuelle Debian. Ouvrez une session en ligne de commande et soyez root.
1. Tuer un programme zombie
1. Écrivez le code suivant dans un éditeur de texte. Nommez le fichier zombie.c :
// zombie.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
pid_t child_pid;
child_pid = fork ();
if (child_pid > 0) {
printf("Processus parent : Attendre 2 minutes.\n");
sleep(120);
}
else {
printf("Processus fils : Sortie immédiate.\n");
exit(0);
}
return(0);
}
2. Compilez avec gcc via la commande suivante :
# gcc zombie.c -o zombie
3. Exécutez le programme zombie en arrière-plan.
4. Vous avez deux minutes. Identifiez le PID et le PPID du processus zombie.
5. Supprimez le zombie. Vérifiez.
2. Identifier une fuite mémoire
1. Écrivez le code suivant dans un éditeur de texte. Nommez le fichier fuite1.c :
// fuite1.c
#include <stdio.h>
#include <stdlib.h>
void main(void)
{
//Allocation de 20 octets
char * pointeur = malloc(20...