Milloin järjestelmä lähettää SIGTERM-prosessin?

Palvelinohjelma sai SIGTERM: n ja pysähtyi (poistumiskoodilla 0). Olen yllättynyt tästä, koska olen melko varma, että siihen oli runsaasti muistia. Missä olosuhteissa linux (busybox) lähettää SIGTERM-prosessin?

Kommentit

  • Voin ' t ajattele tapauksia, joissa ydin tai vakiotyökalu lähettää SIGTERM: n satunnaiseen prosessiin. Mitä voit kertoa meille, mitä ohjelma tekee ja miten se ' alkoi? Kuinka sait tietää ohjelman ' poistumistilasta? Voitko toistaa ongelman? Onko sinulla tarkistettavia lokeja?
  • Se lukee ja kirjoittaa sarjaliikennettä ja vastaa UDP- ja TCP-pyyntöihin. Olen käärinyt suorituksen bash-komentosarjaan ja siksi tiedän poistumiskoodin.
  • Posix-ohjeet osoittavat, että SIGTERM on ehdottomasti käyttäjätason tapahtuma. Onko mahdollista, että joku muu pystyi tappamaan palvelinohjelmasi?
  • Olet! Paluukoodi 0 tarkoittaa normaalia poistumista. Jos SIGTERM olisi, $? asetettaisiin arvoon 143 (128 + signaalin numero).
  • ^ C on myös SIGINT, ei SIGTERM, ja se poistu koodilla 130.

Vastaa

Lähetän tämän vastauksena niin että siinä on jonkinlainen ratkaisu, jos tämä osoittautuu ongelmaksi.

Poistumistila 0 tarkoittaa normaalia poistumista onnistuneesta ohjelmasta. poistuva ohjelma voi valita minkä tahansa kokonaisluvun välillä 0–255 poistumistilaksi. Perinteisesti ohjelmat käyttävät pieniä arvoja. Kuori käyttää arvoja 126 ja sitä uudempia ilmoittaakseen erityisehdoista, joten on parasta välttää niitä.

C-sovellusliittymän tasolla ohjelmat raportoivat 16-bittinen tila¹ , joka koodaa sekä ohjelman poistumistilan että mahdollisen sen tappaneen signaalin.

Kuoressa komennon poistumistila (tallennettu kansioon $?) yhdistää ohjelman todellisen poistumistilan ja signaalin arvon: jos ohjelma tappaa signaalin, $? asetetaan arvoksi, joka on suurempi kuin 128 (useimmissa kuorissa tämä arvo on 128 plus signaalin numero; ATT ksh käyttää 256 + signaalin numeroa ja yash käyttää 384 + signaalin numeroa, mikä välttää epäselvyys, mutta muut kuoret eivät ole noudattaneet esimerkkiä).

Erityisesti, jos $? on 0, ohjelma poistui normaalisti.

Huomaa, että tähän sisältyy prosessi, joka vastaanottaa SIGTERM: n, mutta jolla on signaalinkäsittelijä ja joka lopulta poistuu normaalisti (ehkä kuten epäsuora seuraus SIGTERM-signaalista, ehkä ei).


Vastataksesi otsikossa olevaan kysymykseen, järjestelmä ei koskaan lähetä SIGTERM-tiedostoa automaattisesti. On muutama signaali, joka lähetetään automaattisesti, kuten SIGHUP, kun pääte katoaa, SIGSEGV / SIGBUS / SIGILL, kun prosessi tekee asioita, joita sen ei pitäisi tehdä, SIGPIPE, kun se kirjoittaa rikkoutuneeseen putkeen / pistorasiaan, jne. muutama signaali, joka lähetetään päätelaitteen näppäimen painalluksen takia, lähinnä SIGINT for Ctrl + C , SIGQUIT for Ctrl + \ ja SIGTSTP Ctrl + Z : lle, mutta SIGTERM ei kuulu niihin. Jos prosessi vastaanottaa SIGTERM: n, joku muu prosessi lähetti signaalin.

¹ karkeasti sanottuna

kommentit

  • Hieno selitys siitä, kuinka poistumistila määritetään vastaanotettaessa signaali. Tämä vastaus ei kuitenkaan ' t osoita OP ' -kysymystä.
  • @codeforester Vastasin kysymykseen runko, ei otsikossa oleva kysymys. No, yksi rungon kysymyksistä – koska se perustui väärinkäsitykseen, se on hieman sotkuinen. I ' Lisää muutama sana muusta.
  • Se riippuu kuoresta. Ksh93: ssa se ' s 256 + signum, yashissa ' s 384 + signum
  • Huomaa, että yli 256 a la ksh -arvon käyttö ei välttämättä ole parempi, koska se estää sen siirtämisen exit -tilalle. yash -lähestymistapa on hyvä kompromissi, mutta katso rc toisesta. Katso myös Oletusarvoinen poistumiskoodi, kun prosessi lopetetaan?

Vastaa

SIGTERM on signaali, jota käytetään tyypillisesti prosessin hallinnolliseen lopettamiseen.

Se ei ole signaali, jonka ydin lähettäisi, mutta se on signaali, jonka prosessi tyypillisesti Lähetä lopettaaksesi (sulavasti) toisen prosessin.

Se on signaali, jonka oletusarvoisesti lähettää kill, pkill, killall … -komennot.

Se on signaali, joka lähetetään demoneille niiden pysäyttämiseksi (kuten service some-service stop) tai init ennen sammutusta (seuraa SIGKILL prosesseille, jotka eivät ole onnistuneet päättymään ajoissa SIGTERM: n yhteydessä).

Huomaa, että SIGTERM ei ole signaali, jolle lähetetään ^C. ^C -laitteeseen lähetetty signaali on SIGINT.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *