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
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.
$?
blive indstillet til 143 (128 + signalnummer).