Mon programme de serveur a reçu un sigterm et arrêté (avec le code de sortie 0). Je suis surpris par là, comme je suis à peu près sûr qu'il y avait beaucoup de mémoire pour cela. Dans quelles conditions Linux (Bushbox) envoie-t-elle un sigterm à un processus?
Je posterai cela comme une réponse pour qu'il y ait une sorte de résolution si cela s'avère être le problème.
Un statut de sortie de 0 signifie une sortie normale d'un programme réussi. A Programme de sortie peut choisir n'importe quel entiteur entre 0 et 255 comme statut de sortie. Classiquement, les programmes utilisent de petites valeurs. Les valeurs 126 et ci-dessus sont utilisées par la coquille pour signaler des conditions spéciales, il est donc préférable de les éviter.
Au niveau de l'API C, des programmes Signaler un statut 16 bits¹ qui code à la fois l'état de sortie du programme et le signal qui l'a tué, le cas échéant.
Dans la coquille, un Statut de sortie de la commande (enregistré dans $?
) Confère 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 coquilles, cette valeur est 128 plus le numéro de signal; ATT KSH utilise 256 + numéro de signal et Yash utilise le numéro de signal 384 +, ce qui évite l'ambiguïté, mais l'autre havre de coquilles 't assujetti de costume).
En particulier, si $?
Est 0, votre programme est sorti normalement.
Notez que cela inclut le cas d'un processus qui reçoit un sigterm, mais a un gestionnaire de signal pour celui-ci et sort éventuellement 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 lorsqu'un terminal disparaît, SIGSEGV/SIGBUS/SIGILL lorsqu'un processus ne doit pas faire, Sigpipe lorsqu'il écrit à un tuyau/socket cassé, etc. et il y a Quelques signaux envoyés en raison d'une touche appuyez sur une touche sur un terminal, principalement SIGINT pour Ctrl+C, Sigquit pour Ctrl+\ et SIGTSTP pour Ctrl+Z, mais Sigterm n'est pas un de ceux-ci. Si un processus reçoit SIGTERM, un autre processus envoya ce signal.
¹ grosso modo
SIGTERM est le signal qui est 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 serait généralement envoyé 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 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 ces processus qui n'ont pas réussi à se terminer à temps sur SIGTERM).
Notez que SIGTERM est pas le signal envoyé sur ^C
. Le signal envoyé sur ^C
est SIGINT.