GNU/Linux >> Tutoriels Linux >  >> Linux

Quand le système envoie-t-il un SIGTERM à un processus ?

Je publierai ceci comme réponse afin qu'il y ait une sorte de résolution si cela s'avère être le problème.

Un état de sortie de 0 signifie une sortie normale d'un programme réussi. Un programme sortant peut choisir n'importe quel nombre entier entre 0 et 255 comme état de sortie. Classiquement, les programmes utilisent de petites valeurs. Les valeurs 126 et supérieures sont utilisées par le shell pour signaler des conditions spéciales, il est donc préférable de les éviter.

Au niveau de l'API C, les programmes signalent un état 16 bits¹ qui encode à la fois l'état de sortie du programme et le signal qui l'a tué, le cas échéant.

Dans le shell, le statut de sortie d'une commande (enregistré dans $? ) confond le statut de sortie réel du programme et la valeur du signal :si un programme est tué par un signal, $? est défini sur une valeur supérieure à 128 (avec la plupart des shells, cette valeur est 128 plus le numéro de signal ; ATT ksh utilise 256 + numéro de signal et yash utilise 384 + numéro de signal, ce qui évite l'ambiguïté, mais les autres shells n'ont pas suivi costume).

En particulier, si $? est 0, votre programme s'est terminé normalement.

Notez que cela inclut le cas d'un processus qui reçoit SIGTERM, mais a un gestionnaire de signal pour lui, et finit par se terminer normalement (peut-être comme une conséquence indirecte du signal SIGTERM, peut-être pas).

Pour répondre à la question dans votre titre, SIGTERM n'est jamais envoyé automatiquement par le système. Il y a quelques signaux qui sont envoyés automatiquement comme SIGHUP quand un terminal s'en va, SIGSEGV/SIGBUS/SIGILL quand un processus fait des choses qu'il ne devrait pas faire, SIGPIPE quand il écrit dans un tuyau/socket cassé, etc. Et il y a quelques signaux qui sont envoyés en raison d'une pression sur une touche dans un terminal, principalement SIGINT pour Ctrl +C , SIGQUIT pour Ctrl +\ et SIGTSTP pour Ctrl +Z , mais SIGTERM n'en fait pas partie. Si un processus reçoit SIGTERM, un autre processus a envoyé ce signal.

¹ grosso modo


SIGTERM est le signal généralement utilisé pour terminer administrativement un processus.

Ce n'est pas un signal que le noyau enverrait, mais c'est le signal qu'un processus enverrait généralement pour terminer (gracieusement) un autre processus.

C'est le signal qui est envoyé par défaut par le kill , pkill , killall ... commandes.

C'est le signal qui est envoyé aux démons pour les arrêter (comme sur un service some-service stop ), ou envoyé par init avant l'arrêt (suivi de SIGKILL pour les processus qui n'ont pas réussi à se terminer à temps sur SIGTERM).

Notez que SIGTERM n'est pas le signal qui est envoyé sur ^C . Le signal envoyé sur ^C est SIGINT.


Linux
  1. Le problème Thundering Herd existe-t-il encore sous Linux ?

  2. Que fait l'appel système brk() ?

  3. Comment puis-je savoir sous Linux quel processus a envoyé un signal à mon processus

  4. Comment puis-je supprimer un utilisateur sous Linux lorsque le système indique qu'il est actuellement utilisé dans un processus

  5. Pourquoi popen() invoque-t-il un shell pour exécuter un processus ?

Linux - Ctrl + c peut-il envoyer le signal Sigint à plusieurs processus ?

SIGTERM vs SIGKILL :Quelle est la différence ?

Comment envoyer des processus en arrière-plan sous Linux

Qu'est-ce que la table des processus Linux ? En quoi cela consiste?

Que signifie &à la fin d'une commande Linux ?

Pourquoi la bifurcation de mon processus entraîne-t-elle la lecture infinie du fichier