Når sender systemet et SIGTERM til en prosess?

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

  • Jeg kan ' t tenk på noe tilfelle når kjernen eller et standardverktøy vil sende SIGTERM til en tilfeldig prosess. Hva kan du fortelle oss om hva programmet gjør og hvordan det ' startet? Hvordan fant du ut om programmet ' s avslutningsstatus? Kan du gjengi problemet? Har du logger du kan sjekke?
  • Den leser og skriver til en seriell linje, og svarer på UDP- og TCP-forespørsler. Jeg har pakket utførelsen på et bash-skript, og jeg kjenner derfor utgangskoden.
  • Posix-dokumentasjon indikerer at SIGTERM er en hendelse på brukernivå. Er det mulig at noen andre klarte å drepe serverprogrammet ditt?
  • Du er! Returkoden 0 betyr en normal utgang. Hvis det var en SIGTERM, ville $? bli satt til 143 (128 + signalnummer).
  • Dessuten er ^ C SIGINT, ikke SIGTERM, og det ville gå ut med koden 130.

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.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *