Signal — ukaz Linux/Unix

Linux podpira tako zanesljive signale POSIX (v nadaljevanju "standardni signali") kot signale POSIX v realnem času.

Uporaba signalov v Linuxu

Signali v sistemu Linux povedo operacijski sistem kako ravnati z zagnanim programom ali procesom. Ko običajno zaprete program, to dejansko pošlje signal sistemu, da zapre program. To lahko storite tudi ročno.

Začnite tako, da poiščete postopek, ki ga želite zapreti. To lahko storite z:

ps aux | grep -i 

Torej, če želite zapreti Firefox iz ukazne vrstice, vnesite:

ps aux | grep -i firefox

Dobili boste ogromen seznam procesov Firefox ker je to večnitna aplikacija. Poiščite osnovni proces za /usr/lib/firefox. Običajno je prvi.

Seznam procesov Linux Firefox

Če se vam zdi to preveč, lahko uporabite tudi pgrep. Deluje podobno, vendar vam daje samo ID-je procesov.

pgrep firefox. 

Najnižji ID procesa bo osnovni proces, ki ga potrebujete.

Linux pgrep Firefox

Ko ga imate, poiščite identifikacijsko številko procesa. Prva stvar na seznamu bo vedno uporabnik, ki izvaja postopek. Naslednji bo ID procesa. S tem v roki lahko pošljete a SIGTERM signal procesu, da ga prekine z uporabo ukaz za ubijanje.

ubiti -SIGTERM 4790. 
Linux SIGTERM Firefox

Vsak signal ima tudi ustrezno številko za stenografijo. Številka za SIGTERM je 15, tako da ga lahko uporabite enako kot celotno besedo.

ubiti -15 4790

SIGTERM je pravzaprav privzeto dejanje ukaza kill. Posledično vam ga pravzaprav sploh ni treba navesti. Samo uporabite:

ubiti 4790

Dobili boste popolnoma enak rezultat.

To je vse v redu, če je proces odziven, vendar odzivnega procesa na ta način verjetno ne boste zaustavili, vsaj ne na namizju. Torej, kaj naredite z neodzivnim procesom? Obstaja veliko možnih signalov. Za boljšo predstavo o tem, kako širok je razpon, jih poiščite.

ubiti -l
Seznam signalov za Linux

Ja, veliko jih je. Na srečo se velike večine ne boste dotaknili, razen če začnete razvijati ali pisati skripte za upravljanje sistema. Pogosteje kot ne, ko SIGTERM ne uspe ustaviti neodzivnega procesa, boste poiskali enakovreden Linux Ctrl+Alt+Delete, SIGKILL.

Za razliko od zloglasnega upravitelja procesov Ctrl+Alt+Delete, SIGKILL dejansko deluje. Pravzaprav je mišljeno, da ignorira vse druge dejavnike in uniči postopek kršitve, ne glede na vse. To tudi pomeni, da je SIGKILL lahko nevaren, če postopek zapeljete narobe.

Začnite na enak način, tako da poiščete ID procesa.

pgrep firefox

Zdaj, namesto da uporabite SIGTERM za zaustavitev procesa, uporabite bolj uničujoč SIGKILL.

ubij -SIGKILL 4790

Tudi če je postopek popolnoma zaklenjen, se mora zapreti v nekaj sekundah.

Linux SIGKILL Firefox

Tako kot pri SIGTERM, obstaja številka, ki ustreza SIGKILL. V tem primeru je 9.

ubiti -9 4790

Tako kot prej bi moral postopek skoraj takoj prenehati.

Prav tako se morate zavedati SIGINT. To je prekinitev s tipkovnice in je bolj ukazna, kot si mislite v ukazni vrstici. Ko pritisnete Ctrl+C če želite ustaviti proces iz terminalskega okna, dejansko izdate SIGINT. Njegova koda je 2, in ga lahko uporabite tako kot druge z ukazom kill.

ubiti -2 4790

To ni vse preveč pogosto, saj je veliko bolj verjetno, da boste šli z njim Ctrl+C, vendar se je dobro tega zavedati.

To so daleč najpogostejši signali, ki jih boste srečali pri vsakodnevni uporabi Linuxa. Za bolj tehnično razčlenitev drugih signalov nadaljujte z naslednjim razdelkom.

Tehnične podrobnosti

Če ste sistemski skrbnik ali želite razvijati za Linux, se verjetno želite poglobiti v tehnične podrobnosti signalnega sistema v Linuxu. Naslednji razdelek raziskuje popolno tehnično razčlenitev signalov Linuxa. Te informacije absolutno ne potrebujete za uporabo Linuxa na namizju, a če nameravate raziskati notranje delovanje sistema, se lahko izkaže za neprecenljivo.

Standardni signali

Linux podpira spodaj navedene standardne signale. Več številk signalov je odvisnih od arhitekture, kot je navedeno v stolpcu "Vrednost". (Kjer so podane tri vrednosti, je prva običajno veljavna za alfa in sparc, srednja za i386, ppc in sh, zadnja pa za mips. A - označuje, da na ustrezni arhitekturi ni signala.)

Vnosi v stolpcu »Dejanje« tabele določajo privzeto dejanje za signal, kot sledi:

Termin:Privzeto dejanje je končanje postopka.

Ign:Privzeto dejanje je ignoriranje signala.

Jedro:Privzeto dejanje je končanje procesa in izpis jedra.

Ustavi se:Privzeto dejanje je ustaviti postopek.

Najprej signali, opisani v originalnem standardu POSIX.1.

Signal vrednost Ukrep Komentar
ali smrt nadzornega procesa
SIGINT 2 Termin Prekinitev s tipkovnice
SIGQUIT 3 Jedro Zapri s tipkovnico
SIGILL 4 Jedro Nezakonito navodilo
SIGABRT 6 Jedro Prekinitev signala iz prekiniti(3)
SIGFPE 8 Jedro Izjema s plavajočo vejico
SIGKILL 9 Termin Signal za ubijanje
SIGSEGV 11 Jedro Neveljavna referenca pomnilnika
SIGPIPE 13 Termin Zlomljena cev: pišite v cev brez bralcev
SIGALRM 14 Termin Signal časovnika od alarm(2)
SIGTERM 15 Termin Prekinitveni signal
SIGUSR1 30,10,16 Termin Uporabniško določen signal 1
SIGUSR2 31,12,17 Termin Uporabniško določen signal 2
SIGCHLD 20,17,18 Ign Otrok ustavljen ali prekinjen
SIGCONT 19,18,25 Nadaljujte, če ste ustavljeni
SIGSTOP 17,19,23 Ustavi se Ustavi proces
SIGTSTP 18,20,24 Ustavi se Nehajte tipkati pri tty
SIGTTIN 21,21,26 Ustavi se tty vhod za proces v ozadju
SIGTTOU 22,22,27 Ustavi se tty izhod za proces v ozadju

Signali SIGKILL in SIGSTOP ni mogoče ujeti, blokirati ali prezreti.

Nato signali, ki niso v standardu POSIX.1, ampak opisani v SUSv2 in SUSv3 / POSIX 1003.1-2001.

Signal vrednost Ukrep Komentar
SIGPOLL Termin Dogodek, ki ga je mogoče glasovati (Sys V). Sinonim za SIGIO
SIGPROF 27,27,29 Termin Časovnik za profiliranje je potekel
SIGSYS 12,-,12 Jedro Slab argument za rutino (SVID)
SIGTRAP 5 Jedro Past sledenja/prekinitvene točke
SIGURG 16,23,21 Ign Nujno stanje na vtičnici (4,2 BSD)
SIGVTALRM 26,26,28 Termin Virtualna budilka (4,2 BSD)
SIGXCPU 24,24,30 Jedro Časovna omejitev procesorja je presežena (4,2 BSD)
SIGXFSZ 25,25,31 Jedro Omejitev velikosti datoteke je presežena (4,2 BSD)

Do vključno Linuxa 2.2, privzeto vedenje za SIGSYS, SIGXCPU, SIGXFSZin (na arhitekturah, ki niso SPARC in MIPS) SIGBUS je bilo treba končati postopek (brez izpisa jedra). (Pri nekaterih drugih Unisih je privzeto dejanje za SIGXCPU in SIGXFSZ je zaključiti proces brez izpisa jedra.) Linux 2.4 je v skladu z zahtevami POSIX 1003.1-2001 za te signale in postopek konča z izpisom jedra.

Nato pa različni drugi signali.

Signal vrednost Ukrep Komentar
SIGEMT 7,-,7 Termin
SIGSTKFLT -,16,- Termin Napaka sklada na koprocesorju (neuporabljeno)
SIGIO 23,29,22 Termin V/I je zdaj možen (4.2 BSD)
SIGCLD -,-,18 Ign Sinonim za SIGCHLD
SIGPWR 29,30,19 Termin Izpad električne energije (System V)
SIGINFO 29,-,- Sinonim za SIGPWR
SIGLOST -,-,- Termin Zaklepanje datoteke je izgubljeno
SIGWINCH 28,28,20 Ign Signal za spremembo velikosti okna (4,3 BSD, Sun)
SIGUNUSED -,31,- Termin Neuporabljen signal (bo SIGSYS)

(Signal 29 je SIGINFO / SIGPWR na alfi ampak SIGLOST na šparc.)

SIGEMT ni določen v POSIX 1003.1-2001, vendar se kljub temu pojavlja na večini drugih Unices, kjer je njegovo privzeto dejanje običajno končanje procesa z izpisom jedra.

SIGPWR (ki ni določen v POSIX 1003.1-2001) je običajno privzeto prezrt na tistih drugih Unisih, kjer se pojavi.

SIGIO (ki ni določen v POSIX 1003.1-2001) je privzeto prezrt na več drugih Unicom.

Signali v realnem času

Linux podpira signale v realnem času, kot so prvotno opredeljeni v razširitvah za realni čas POSIX.4 (in zdaj vključeni v POSIX 1003.1-2001). Linux podpira 32 signalov v realnem času, oštevilčenih od 32 (SIGRTMIN) do 63 (SIGRTMAX). (Programi se morajo vedno sklicevati na signale v realnem času z uporabo zapisov SIGRTMIN+n, saj se obseg signalnih številk v realnem času razlikuje med Unicom.)

Za razliko od standardnih signalov, signali v realnem času nimajo vnaprej določenih pomenov: celoten nabor signalov v realnem času se lahko uporablja za namene, ki jih definira aplikacija. (Upoštevajte, da implementacija LinuxThreads uporablja prve tri signale v realnem času.)

Privzeto dejanje za neobravnavan signal v realnem času je, da se postopek sprejemanja konča.

Signali v realnem času se razlikujejo po naslednjem:

  1. V čakalno vrsto je mogoče postaviti več primerkov signalov v realnem času. Nasprotno, če je dostavljenih več primerkov standardnega signala, medtem ko je ta signal trenutno blokiran, je v čakalni vrsti samo en primerek.
  2. Če je signal poslan z uporabo sigqueue(2) se lahko s signalom pošlje spremljevalna vrednost (bodisi celo število ali kazalec). Če sprejemni proces vzpostavi upravljalca za ta signal z uporabo SA_SIGACTION označite za sigakcija(2) potem lahko te podatke pridobi preksi_value področju signinfo_t struktura, posredovana kot drugi argument upravljavcu. Poleg tega je si_pid in si_uid polja te strukture se lahko uporabijo za pridobitev PID in resničnega uporabniškega ID-ja procesa, ki pošilja signal.
  3. Signali v realnem času se dostavljajo v zagotovljenem vrstnem redu. Več signalov iste vrste v realnem času se dostavi v vrstnem redu, v katerem so bili poslani. Če se procesu pošljejo različni signali v realnem času, se dostavijo začenši s signalom z najmanjšo številko. (To pomeni, da imajo signali z nizkim številom najvišjo prednost.)

Če za proces čakajo tako standardni signali kot signali v realnem času, POSIX pusti nedoločenega, kateri je prvi dostavljen. Linux, tako kot mnoge druge izvedbe, v tem primeru daje prednost standardnim signalom.

V skladu s POSIX bi morala izvedba dovoliti, da se v čakalno vrsto procesa postavi vsaj _POSIX_SIGQUEUE_MAX (32) signalov v realnem času. Vendar namesto omejitve na proces Linux za vse procese nalaga omejitev števila signalov v realnem času v čakalni vrsti. To omejitev si lahko ogledate (in s privilegijem) spremenite prek /proc/sys/kernel/rtsig-max mapa. Povezana datoteka,/proc/sys/kernel/rtsig-max, lahko uporabite za ugotavljanje, koliko signalov v realnem času je trenutno v čakalni vrsti.

V SKLADU Z.

POSIX.1.

Uporabi človek ukaz (% človek), da vidite, kako se ukaz uporablja v vašem računalniku.