Différence entre le signal de mise à mort moins violent -HUP (1) -INT (2) et -TERM (15)

32

Hormis le plus violent kill -9(SIGKILL), je ne comprends pas très bien la différence entre les 3 autres signaux communs ( ici ) -HUP(1), -INT(2) et -TERM(15).

Dans quels scénarios l'un fonctionnerait-il et l'autre non?

En général, quand -9( -KILL) échoue?

Pour moi, ils semblent demander au processus de se terminer avec élégance , sans enregistrer . Notant la dureté, je dirais -HUP < -TERM < -INT < -KILL.

Kenny
la source
HUPne signifie pas nécessairement que le programme se fermera. Certains programmes utilisent SIGHUPpour recharger les fichiers de configuration. SIGKILLéchoue, ou plutôt est reporté, lorsque le processus est en sommeil sans interruption .
muru

Réponses:

52

SIGKILL ne manque jamais de tuer un processus en cours, c'est le point. D'autres signaux existent pour donner à l'application une chance de réagir.

Le comportement par défaut de SIGINT, SIGTERM, SIGQUIT et SIGHUP est de tuer le programme. Cependant, les applications sont autorisées à installer un gestionnaire pour ces signaux. Ainsi, le comportement réel des applications lorsqu'elles reçoivent ces signaux est une question de convention (que chaque application peut suivre ou non), pas de conception de système.

SIGINT est le «plus faible» du lot. Sa signification conventionnelle est «arrêtez ce que vous faites en ce moment et attendez d'autres commentaires de l'utilisateur». C'est le signal généré par Ctrl+ Cdans un terminal. Les programmes non interactifs le traitent généralement comme SIGTERM.

SIGTERM est le signal de mise à mort «normal». Il indique à l'application de quitter proprement. L'application peut prendre du temps pour enregistrer son état, pour libérer des ressources telles que des fichiers temporaires qui autrement resteraient en arrière, etc. Une application qui ne souhaite pas être interrompue pendant une application critique peut ignorer SIGTERM pendant un certain temps.

SIGHUP est à peu près identique à SIGTERM en termes de dureté, mais il a un rôle spécifique car il est automatiquement envoyé aux applications s'exécutant dans un terminal lorsque l'utilisateur se déconnecte de ce terminal (étymologiquement, car l'utilisateur se connectait via une ligne téléphonique et le modem pendu). SIGHUP est souvent involontaire, contrairement à SIGTERM qui doit être envoyé explicitement, les applications doivent donc essayer de sauvegarder leur état sur un SIGHUP. SIGHUP a également une signification conventionnelle complètement différente pour les applications non destinées à l'utilisateur ( démons ), qui est de recharger leur fichier de configuration.

SIGQUIT est le plus dur des signaux ignorables. Il est destiné à être utilisé lorsqu'une application se comporte mal et doit être supprimée maintenant, et par défaut, elle laisse traditionnellement un fichier de vidage de mémoire (les systèmes modernes où la plupart des utilisateurs ne savent pas ce qu'est un fichier de base ont tendance à ne pas les produire par défaut) . Les applications peuvent définir un gestionnaire mais ne devraient pas faire grand-chose (en particulier, ne pas enregistrer d'état) car l'intention de SIGQUIT est d'être utilisée lorsque quelque chose ne va vraiment pas.

Gilles, arrête de faire le mal
la source
Pouvez-vous nous en dire plus sur "sauver leur état"? Si je suis dans un éditeur de texte et que je le tue, je suppose que le contenu n'est pas enregistré.
Kenny
2
@Kenny La plupart des éditeurs n'enregistrent pas le fichier, car vous avez peut-être apporté des modifications temporaires que vous n'aviez pas l'intention d'enregistrer. Les éditeurs avancés (par exemple vi, emacs) ont un fichier de sauvegarde automatique où ils sauvegardent les données de temps en temps; sur SIGHUP, ils s'assurent généralement que le fichier d'enregistrement automatique est à jour.
Gilles 'SO- arrête d'être méchant'