13/05/2024

Commandes et Système

Sigterm VS Sigkill

I. Présentation

Pour communiquer entre eux, les processus utilisent des messages et des signaux que le système d'exploitation se charge de délivrer par le biais de tubes. Les signaux peuvent être directement envoyés à l'aide de la commande kill qui peut s’avérer très utile lorsqu’un processus se comporte de manière inattendue.

Un processus peut cependant choisir de ne pas répondre à certains signaux, ce refus dépend du niveau critique de la tâche en cours qui peut parfois modifier l'état du processus, le rendant temporairement hermétique à toutes demandes externes.

II. La commande kill

La commande kill en elle même est simple d'utilisation, elle permet d'envoyer un signal à un processus. Le manuel nous renseigne sur son utilisation :

kill [options] <pid>

De façon plus précise, lorsque la commande kill est utilisée elle envoie un signal particulier au processus ciblé, ce dernier l'examine et exécute, en se référant au fichier signal.h, la marche à suivre. (Le fichier signal.h fait partie de la bibliothèque C et est utilisé pour traiter les signaux)

La liste des signaux disponibles est accessible avec l'option l de la commande kill.

kill -l
  1) SIGHUP  2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
  6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
 [...]

Pour plus de détails sur les signaux vous pouvez vous référer à la section 7 du manuel de signal : man 7 signal.

Parmi ces signaux nous avons par exemple SIGHUP (signal n°1) qui indique au processus qu'il doit relire sa configuration, SIGTERM (signal n°15) qui demande au processus de s'arrêter proprement et d'en informer ses éventuels fils, SIGCHLD (signal n°17) qui est envoyé au processus père pour l'informer de la mort de son fils, SIGSTOP (signal n°19) qui met en pause l'exécution du processus ou encore SIGKILL (signal n°9) qui termine le processus brutalement.

Les signaux SIGKILL et SIGSTOP ont une particularité, ils ne sont pas envoyés au processus mais directement adressés au système qui se chargera de stopper ou d'arrêter le processus.

Si rien n'est précisé dans la commande kill, le signal par défaut sera SIGTERM, kill est donc équivalent à kill -15 et le processus s'arrêtera donc proprement.

III. SIGTERM contre SIGKILL

L'envoi des signaux SIGTERM ou SIGKILL par le biais des commande kill et kill -9 sur des processus ont des effets très différents.

Le signal SIGTERM est couramment utilisé pour simplement mettre fin à une application. SIGKILL quand à lui permet de forcer un arrêt mais l'effectue de façon brutale.

A. Le signal SIGTERM

Les commandes ci-dessous sont équivalentes et permettent toutes de mettre fin au processus n° 1337 en envoyant le signal SIGTERM, signal n°15.

kill 1337
kill -15 1337
kill -TERM 1337
kill -SIGTERM 1337

Après avoir reçu un tel signal le processus s'arrête immédiatement (ou après un bref délais le temps de libérer les ressources et d'arrêter les processus fils).

Ce signal permet au processus de lui laisser la possibilité d'informer ses processus fils qu'il va se terminer, de finir sa tâche, de permettre au processus fils de finir la leur, d’informer leur père le cas échéant et d'enfin libérer les ressources. Il s'agit là donc d'un arrêt tout à fait normal pour un processus.

Il existe cependant des cas ou le processus semble ignorer ce signal et continue quand même de s’exécuter car il effectue une tâche qui ne doit pas être interrompue.

Lorsqu'un processus ne répond pas au signal SIGTERM et qu'il est nécessaire d'y mettre un terme, il est possible d'utiliser le signal SIGKILL.

B. Le signal SIGKILL

Les commandes ci-dessous sont équivalentes et permettent toutes de mettre fin au processus n° 1337 en envoyant le signal SIGKILL, signal n°9.

kill -9 1337
kill -KILL 1337
kill -SIGKILL 1337

Le signal SIGKILL, contrairement au signal SIGTERM, est directement envoyé au noyau, c'est donc le système qui va stopper le processus et ce signal ne peut être ignoré.

L'utilisation du signal SIGKILL peut entraîner des problèmes car l'arrêt est brutal, le processus ne pourra pas terminer sa tâche en cours, libérer correctement les ressources et informer ses processus fils de son arrêt qui, devenus orphelins, seront alors adoptés par init.

L'envoi d'un signal SIGKILL devrait suffire à stopper un processus puisqu'il est directement géré par le noyau, cependant il existe toutefois un cas (plutôt rare) où SIGKILL est malheureusement sans effet. Le dernier recours sera alors le redémarrage du système.

IV. Le redémarrage système

Lorsqu’un processus est en attente d'une ressource matérielle il passe en sommeil ininterruptible (état D), cet état qui ne peut être interrompu permet au processus de gérer les accès aux ressources matérielles en toute sécurité. Le processus sera de nouveau réceptif aux signaux dès que la ressource demandée sera de nouveau disponible ou après un time-out si ce dernier a été spécifié avant son sommeil.

Il est parfois possible, suite à un bug matériel ou à une erreur de conception, qu'un processus ne puisse jamais accéder à cette ressource et reste bloqué dans l'état D. Si de tels processus doivent malgré tout être arrêtés, il reste un dernier recours : le redémarrage du système.

C'est le seul rare cas où il est nécessaire de redémarrer un système Linux. Ce choix des développeurs s'explique par soucis de stabilité, pouvoir stopper un processus en lien direct avec des échanges d'informations entre le processeur et les périphériques est trop compromettant pour le système.

author avatar
Aline
Administratrice réseaux et systèmes (Linux). Entre deux maintenances serveur, j'écris des articles dans le but de partager mon expérience professionnelle sur Linux, les réseaux informatiques, la sécurité et le scripting.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.