Arrêter un processus Linux

Kill -9

T'I/O

La gestion des entrées/sorties a toujours été le point faible des systèmes d'exploitation.
Bien que de meilleur qualité que certains OS grands publiques, Linux n'échappe pas à ce dogme. Les problèmes d'I/O peuvent être source de comportements inattendus : un service qui se bloque ou refuse de s'arrêter ou des processus zombies.
A la clé, vous pouvez penser redémarrer un service avec une nouvelle configuration mais en fait vous utilisez toujours l'ancienne. Fun party en perspective...

Cet article présente une approche pour arrêter un service bloqué par un problème d'I/O sous Linux.

L'arrêt de service

La meilleure façon d'arrêter un service est d'utiliser le script de gestion du service mise au point par le concepteur.
Les scripts de gestion de services sont localisés sous /etc/init.d/

Par exemple pour arrêter votre serveur Apache, lancez la commande :

# /etc/init.d/apache2 stop

Pour vérifier que le service Apache est bien arrêté, exécutez la commande :

$ pgrep -l apache2

Si il reste des process actif, passez au chapitre suivant pour forcer l'arrêt.

La demande d'arrêt immédiat kill -9

L'arrêt normal d'un service envoie souvent un message kill -TERM ou kill -15. Le service est alors prié de déclencher sa procédure d'arrêt.
Mais en cas de contexte imprévu par le développeur, ce signal peut être ignoré.
Vous allez alors envoyer un signal d'arrêt immédiat : kill -KILL ou kill -9

# pkill -9 apache2

Normalement, le processus s'arrête immédiatement en libérant ses ressources. Ce signal est rarement bloqué mais il peux arriver que le système verrouille le handle du service sur un I/O, empêchant tout autre processus d'interrompre son fonctionnement, la commande kill incluse. Dans ce cas, le résultat est incertain. Le process peut devenir un zombie, moitié mort, moitié vivant. Pour vérifier que le service Apache est bien arrêté, exécutez la commande :

$ pgrep -l apache2

Si il reste des process actif, passez au chapitre suivant pour forcer l'arrêt.

L'arrêt des communications réseaux

Premier cas, votre service a ouvert un flux réseaux. Votre protocole, peu robuste, a verrouillé le flux, interdisant l'arrêt du daemon.
Pour identifier les flux ouverts du type , exécutez la commande :

# netstat -v -a

Connexions Internet actives (serveurs et établies)
Proto Recv-Q Send-Q Adresse locale          Adresse distante        Etat
tcp        0      0 localhost:mysql         *:*                     LISTEN
tcp        0      0 *:ssh                   *:*                     LISTEN
tcp        0      0 localhost:smtp          *:*                     LISTEN
tcp        0      0 localhost:953           *:*                     LISTEN
tcp6       0      0 [::]:www                [::]:*                  CLOSING
tcp6       0      0 [::]:domain             [::]:*                  LISTEN
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN

Cette sortie indique qu'un process sur le port 80 (www) tente de fermer sa socket.
Si cette situation dure, vous pouvez tenter de redémarrer le réseau nécessaire au fonctionnement de Apache afin de forcer la fermeture dans l'état de ce flux.

# /etc/init.d/networking stop
# pkill -9 apache2
# /etc/init.d/networking start
# pgrep -l apache2

Si le processus Apache n'est toujours pas mort, nous pouvons vérifier la mémoire partagée ou mémoire sémaphore.

L'arrêt des communications mémoires inter-processus

Deuxième cas, votre service utilise une zone mémoire partagée, une file de messages ou une sémaphore. Lancez la commande :

# ipcs

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status

------ Semaphore Arrays --------
key        semid      owner      perms      nsems
0x00000000 0          www-data  600        1
0x00000000 262152     www-data  600        1

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages

Dans cet exemple, l'utilisateur www-data, qui est le propriétaire du service apache2, utilise 2 sémaphores. Vous allez les supprimer, puis demander l'arrêt du daemon apache2 :

# ipcrm -s 0 -s 262152
# pkill -9 apache2
# pgrep apache2

Si le process Apache tourne encore, passez au chapitre suivant.

Le redémarrage du serveur Linux

Situation exceptionnelle, bug du noyau Linux, vous êtes contraint de redémarrer votre serveur pour un retour à la normal.

Sauvegardez vos fichiers et lancez la commande suivante :

# shutdown -r now

Votre serveur lance la procédure de redémarrage et tout rentre dans l'ordre.