Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Linux
  3. Maintenance des applications
Extrait - Linux Administration avancée - Maintenance et exploitation de vos serveurs (3e édition)
Extraits du livre
Linux Administration avancée - Maintenance et exploitation de vos serveurs (3e édition) Revenir à la page d'achat du livre

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...