Hvornår sender systemet et SIGTERM til en proces?

Mit serverprogram modtog en SIGTERM og stoppede (med exit kode 0). Jeg er overrasket over dette, da jeg er ret sikker på, at der var masser af hukommelse til det. Under hvilke betingelser sender linux (busybox) et SIGTERM til en proces?

Kommentarer

  • Jeg kan ' t tænk på ethvert tilfælde, hvor kernen eller et standardværktøj ville sende SIGTERM til en tilfældig proces. Hvad kan du fortælle os om, hvad programmet laver, og hvordan det ' startede? Hvordan fandt du ud af programmet ' s exit-status? Kan du gengive problemet? Har du logfiler, du kan kontrollere?
  • Den læser og skriver til en seriel linje og reagerer på UDP- og TCP-anmodninger. Jeg har pakket indførelsen i et bash-script, og derfor kender jeg exit-koden.
  • Posix-dokumentation indikerer, at SIGTERM er strengt en begivenhed på brugerniveau. Er det muligt, at en anden var i stand til at dræbe dit serverprogram?
  • Du er! Returkoden 0 betyder en normal udgang. Hvis der var en SIGTERM, ville $? blive indstillet til 143 (128 + signalnummer).
  • Også, ^ C er SIGINT, ikke SIGTERM, og det ville gå ud med koden 130.

Svar

Jeg sender dette som et svar, så at der er en slags opløsning, hvis dette viser sig at være problemet.

En exitstatus på 0 betyder en normal exit fra et vellykket program. Et afslutningsprogram kan vælge ethvert heltal mellem 0 og 255 som dets udgangsstatus. Konventionelt bruger programmer små værdier. Værdier 126 og derover bruges af skallen til at rapportere særlige forhold, så det er bedst at undgå dem.

På C API-niveau rapporterer programmer en 16-bit status¹ , der koder for både programmets udgangsstatus og det signal, der dræbte det, hvis der er nogen.

I skallen er en kommando “s exit status (gemt i $?) samler programmets aktuelle exitstatus og signalværdien: hvis et program dræbes af et signal, $? er indstillet til en værdi større end 128 (med de fleste skal er denne værdi 128 plus signalnummeret; ATT ksh bruger 256 + signalnummer og yash bruger 384 + signalnummer, hvilket undgår tvetydigheden, men de andre skaller har ikke fulgt efter).

Især hvis $? er 0, afsluttes dit program normalt.

Bemærk, at dette inkluderer tilfældet med en proces, der modtager SIGTERM, men som har en signalbehandler til det, og til sidst afslutter normalt (måske som en indirekte konsekvens af SIGTERM-signalet, måske ikke).


For at besvare spørgsmålet i din titel sendes SIGTERM aldrig automatisk af systemet. Der er et par signaler, der sendes automatisk som SIGHUP, når en terminal går væk, SIGSEGV / SIGBUS / SIGILL, når en proces gør ting, den ikke burde gøre, SIGPIPE, når den skriver til et ødelagt rør / stik osv. Og der er et par signaler, der sendes på grund af et tastetryk i en terminal, hovedsageligt SIGINT for Ctrl + C , SIGQUIT for Ctrl + \ og SIGTSTP for Ctrl + Z , men SIGTERM er ikke en af dem. Hvis en proces modtager SIGTERM, sendte en anden proces signalet.

¹ groft sagt

Kommentarer

  • Fin forklaring på, hvordan exitstatus bestemmes ved modtagelse af et signal. Imidlertid svarer dette svar ikke ' t adresse OP ' s spørgsmål.
  • @codeforester Jeg besvarede spørgsmålet i krop, ikke spørgsmålet i titlen. Nå, et af spørgsmålene i kroppen – i betragtning af at det var baseret på en misforståelse, er det lidt rodet. Jeg ' Jeg tilføjer et par ord om resten.
  • Det afhænger af skallen. I ksh93 er det ' s 256 + signum, i yash er det ' s 384 + signum
  • Bemærk at Brug af en værdi over 256 a la ksh er ikke nødvendigvis bedre, da det forhindrer, at den sendes til exit. yash tilgangen er et godt kompromis, men se rc for en anden. Se også Standardudgangskode, når processen afsluttes?

Svar

SIGTERM er det signal, der typisk bruges til administrativt at afslutte en proces.

Det er ikke et signal, som kernen ville sende, men det er signalet, som en proces typisk ville send for at afslutte (yndefuldt) en anden proces.

Det er signalet, der som standard sendes af kill, pkill, killall … kommandoer.

Det er signalet, der sendes til dæmoner for at stoppe dem (som ved en service some-service stop) eller sendes af init før nedlukning (efterfulgt af SIGKILL for de processer, der ikke har formået at afslutte i tide ved SIGTERM).

Bemærk, at SIGTERM er ikke det signal, der sendes til ^C. Signal sendt til ^C er SIGINT.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *