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

Mon programme serveur a reçu un SIGTERM et sest arrêté (avec le code de sortie 0). Je suis surpris par cela, car je suis presque sûr quil y avait beaucoup de mémoire pour cela. Dans quelles conditions linux (busybox) envoie-t-il un SIGTERM à un processus?

Commentaires

  • Je peux ' ne pense à aucun cas où le noyau ou un outil standard enverrait SIGTERM à un processus aléatoire. Que pouvez-vous nous dire sur ce que fait le programme et comment ' a-t-il démarré? Comment avez-vous connu le statut de sortie du programme '? Pouvez-vous reproduire le problème? Avez-vous des journaux que vous pouvez vérifier?
  • Il lit et écrit sur une ligne série et répond aux requêtes UDP et TCP. Jai encapsulé lexécution sur un script bash et je connais donc le code de sortie.
  • La documentation Posix indique que SIGTERM est strictement un événement de niveau utilisateur. Est-il possible que quelquun dautre ait pu tuer votre programme serveur?
  • Vous lêtes! Le code retour 0 signifie une sortie normale. Sil y avait un SIGTERM, $? serait mis à 143 (128 + numéro de signal).
  • De plus, ^ C est SIGINT, pas SIGTERM, et ce serait quitter avec un code de 130.

Réponse

Je « publierai ceci comme une réponse donc quil existe une sorte de résolution si cela savère être le problème.

Un statut de sortie de 0 signifie une sortie normale dun programme réussi. Un programme sortant peut choisir nimporte quel entier entre 0 et 255 comme état de sortie. Par convention, 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 lAPI C, les programmes signalent un état 16 bits¹ qui encode à la fois létat de sortie du programme et le signal qui la tué, le cas échéant.

Dans le shell, un (enregistré dans $?) confond létat 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 de 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 lambiguïté, mais les autres shells nont pas emboîté le pas).

En particulier, si $? vaut 0, votre programme sest terminé normalement.

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


Pour répondre à la question de votre titre, SIGTERM nest jamais envoyé automatiquement par le système. Il y a quelques signaux qui sont envoyés automatiquement comme SIGHUP quand un terminal disparaît, SIGSEGV / SIGBUS / SIGILL quand un processus fait des choses quil ne devrait pas faire, SIGPIPE quand il écrit sur un pipe / socket cassé, etc. Et il y a quelques signaux qui sont envoyés suite à un appui sur une touche dans un terminal, principalement SIGINT pour Ctrl + C , SIGQUIT pour Ctrl + \ et SIGTSTP pour Ctrl + Z , mais SIGTERM nen fait pas partie. Si un processus reçoit SIGTERM, un autre processus a envoyé ce signal.

¹ grosso modo

Commentaires

  • Belle explication de la façon dont létat de sortie est déterminé lors de la réception dun signal. Cependant, cette réponse nadresse pas ' la question de OP '.
  • @codeforester Jai répondu à la question dans le corps, pas la question dans le titre. Eh bien, une des questions dans le corps – étant donné quelle était basée sur un malentendu, cest un peu brouillon. I ' Je vais ajouter quelques mots sur le reste.
  • Cela dépend du shell. Dans ksh93, il ' s 256 + signum, dans yash, il ' s 384 + signum
  • Notez que utiliser une valeur supérieure à 256 a la ksh nest pas forcément mieux car cela empêche sa transmission à exit. Lapproche yash est un bon compromis, mais voir rc pour un autre. Voir aussi Code de sortie par défaut lorsque le processus est terminé?

Réponse

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

Ce nest pas un signal que le noyau enverrait, mais cest le signal quun processus enverrait généralement envoyer pour terminer (gracieusement) un autre processus.

Cest le signal qui est envoyé par défaut par kill, pkill, killall … commandes.

Cest le signal qui est envoyé aux démons pour les arrêter (comme lors dun service some-service stop), ou envoyé par init avant larrêt (suivi de SIGKILL pour les processus qui nont pas réussi à se terminer à temps sur SIGTERM).

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

Laisser un commentaire

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