Serverprogrammet mitt mottok en SIGTERM og stoppet (med utgangskode 0). Jeg er overrasket over dette, siden jeg er ganske sikker på at det var mye minne for det. Under hvilke forhold sender linux (busybox) et SIGTERM til en prosess?
Kommentarer
Svar
Jeg legger ut dette som et svar så at det er en slags løsning hvis dette viser seg å være problemet.
En utgangsstatus på 0 betyr en normal utgang fra et vellykket program. Et utgående program kan velge hvilket som helst heltall mellom 0 og 255 som utgangsstatus. Vanligvis bruker programmer små verdier. Verdiene 126 og over brukes av skallet til å rapportere spesielle forhold, så det er best å unngå dem.
På C API-nivå rapporterer programmer en 16-biters status¹ som koder både programmets utgangsstatus og eventuelt signalet som drepte det.
I skallet, en kommando «s exit status (lagret i $?
) samler den faktiske exit-statusen til programmet og signalverdien: hvis et program blir drept av et signal, $?
er satt til en verdi større enn 128 (med de fleste skjell er denne verdien 128 pluss signalnummeret; ATT ksh bruker 256 + signalnummer og yash bruker 384 + signalnummer, noe som unngår tvetydigheten, men de andre skjellene har ikke fulgt etter).
Spesielt, hvis $?
er 0, avsluttet programmet normalt.
Merk at dette inkluderer tilfelle av en prosess som mottar SIGTERM, men som har en signalbehandler for den, og til slutt avslutter normalt (kanskje som en indirekte konsekvens av SIGTERM-signalet, kanskje ikke).
For å svare på spørsmålet i tittelen din, sendes SIGTERM aldri automatisk av systemet. Det er noen få signaler som sendes automatisk som SIGHUP når en terminal går, SIGSEGV / SIGBUS / SIGILL når en prosess gjør ting den ikke burde gjøre, SIGPIPE når den skriver til et ødelagt rør / stikkontakt osv. Og det er noen få signaler som sendes på grunn av et tastetrykk i en terminal, hovedsakelig SIGINT for Ctrl + C , SIGQUIT for Ctrl + \ og SIGTSTP for Ctrl + Z , men SIGTERM er ikke en av dem. Hvis en prosess mottar SIGTERM, sendte en annen prosess signalet.
¹ grovt sagt
Kommentarer
- Fin forklaring på hvordan utgangsstatus bestemmes ved mottak av signal. Imidlertid svarer ikke dette svaret ' t OP ' sitt spørsmål.
- @codeforester Jeg svarte på spørsmålet i kropp, ikke spørsmålet i tittelen. Vel, et av spørsmålene i kroppen – gitt at det var basert på en misforståelse, er det litt rotete. Jeg ' Legg til noen ord om resten.
- Det avhenger av skallet. I ksh93 er det ' s 256 + signum, i yash, det ' s 384 + signum
- Merk at Å bruke en verdi over 256 a la ksh er ikke nødvendigvis bedre, da det forhindrer at den overføres til
exit
.yash
tilnærmingen er et godt kompromiss, men se rc for en annen. Se også Standard utgangskode når prosessen avsluttes?
Svar
SIGTERM er signalet som vanligvis brukes til å avslutte en prosess administrativt.
Det er ikke et signal som kjernen vil sende, men det er signalet en prosess vanligvis vil send for å avslutte (elegant) en annen prosess.
Det er signalet som sendes som standard av kill
, pkill
, killall
… kommandoer.
Det er signalet som sendes til demoner for å stoppe dem (som på en service some-service stop
), eller sendes av init
før nedleggelse (etterfulgt av SIGKILL for de prosessene som ikke har klart å avslutte i tide ved SIGTERM).
Merk at SIGTERM er ikke signalet som sendes på ^C
. Signalet som sendes til ^C
er SIGINT.
$?
bli satt til 143 (128 + signalnummer).