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.

Č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.

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.

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

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.

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:
- 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.
- Č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.
- 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.