Signal — Linux/Unix-kommando
Linux understøtter både POSIX-pålidelige signaler (herefter "standardsignaler") og POSIX-realtidssignaler.
Brug af signaler på Linux
Signaler på et Linux-system fortæller operativ system hvordan man håndterer et kørende program eller proces. Når du lukker et program normalt, sender det faktisk et signal til systemet, der fortæller det, at det skal lukke programmet. Du kan også gøre dette manuelt.
Start med at lede efter en proces, som du vil lukke ned. Du kan gøre dette med:
ps aux | grep -i
Så hvis du vil lukke Firefox fra kommandolinjen, skal du indtaste:
ps aux | grep -i firefox
Du får en enorm liste over processer fra Firefox fordi det er en flertrådsapplikation. Se efter basisprocessen for /usr/lib/firefox. Det er normalt den første.

Hvis du finder det overvældende, kan du også bruge pgrep. Det fungerer på samme måde, men giver dig kun proces-id'erne.
pgrep firefox.
Det laveste proces-id vil være den basisproces, du har brug for.

Når du har det, skal du finde proces-id-nummeret. Den første ting, der er angivet, vil altid være brugeren, der kører processen. Det næste vil være proces-id'et. Med det i hånden kan du sende en
dræbe -SIGTERM 4790.

Hvert signal har også et tilsvarende nummer for stenografi. Nummeret for SIGTERM er 15, så du kan bruge det på samme måde som hele ordet.
dræbe -15 4790
SIGTERM er faktisk standardhandlingen for kill-kommandoen. Som et resultat behøver du faktisk slet ikke at angive det. Brug blot:
dræb 4790
Du får nøjagtig det samme resultat.
Det er alt godt, hvis processen er responsiv, men du vil sandsynligvis ikke lukke en responsiv proces ned på denne måde, i hvert fald ikke på en desktop. Så hvad gør du med en proces, der ikke reagerer? Der er et væld af mulige signaler. For en bedre ide om, hvor bredt udvalget er, skal du slå dem op.
dræbe -l

Ja, der er mange. Heldigvis vil du ikke røre det store flertal, medmindre du begynder at udvikle eller skrive systemadministrationsscripts. Oftere end ikke, når SIGTERM ikke formår at stoppe en proces, der ikke reagerer, vil du se på Linux-ækvivalenten til Ctrl+Alt+Delete, SIGKILL.
I modsætning til den berygtede Ctrl+Alt+Delete-procesmanager fungerer SIGKILL faktisk. Faktisk er det meningen, at man skal ignorere alle andre faktorer og fjerne den krænkende proces, uanset hvad. Det betyder også, at SIGKILL kan være farligt, hvis du tager processen forkert.
Start på nøjagtig samme måde ved at slå proces-id'et op.
pgrep firefox
Nu, i stedet for at bruge SIGTERM til at stoppe processen, så brug den mere destruktive SIGKILL.
dræbe -SIGKILL 4790
Selvom processen er helt låst, bør den lukke inden for et par sekunder.

Ligesom med SIGTERM, er der et tal, der svarer til SIGKILL. I dette tilfælde er det 9.
dræbe -9 4790
Ligesom før skulle processen være død næsten øjeblikkeligt.
Du skal også være opmærksom på SIGINT. Dette er en afbrydelse fra tastaturet, og det er mere kommando end du tror på kommandolinjen. Når du trykker på Ctrl+C for at stoppe en proces fra et terminalvindue, udsteder du faktisk en SIGINT. Dens kode er 2, og du kan bruge det ligesom de andre med kill-kommandoen.
dræbe -2 4790
Dette er ikke alt for almindeligt, da du er meget mere tilbøjelig til at gå med Ctrl+C, men det er godt at være opmærksom på det.
Dette er langt de mest almindelige signaler, du vil støde på i din daglige Linux-brug. For en mere teknisk opdeling af de andre signaler, fortsæt til næste afsnit.
De tekniske detaljer
Hvis du er systemadministrator eller ønsker at udvikle til Linux, vil du sikkert gerne dykke dybere ned i de tekniske detaljer bag signalsystemet på Linux. Det næste afsnit udforsker den fulde tekniske opdeling af Linux-signaler. Du behøver absolut ikke disse oplysninger for at bruge Linux på dit skrivebord, men hvis du har til hensigt at udforske systemets indre funktioner, kan det vise sig at være uvurderligt.
Standard signaler
Linux understøtter standardsignalerne nedenfor. Flere signalnumre er arkitekturafhængige, som angivet i kolonnen "Værdi". (Hvor der er angivet tre værdier, er den første normalt gyldig for alpha og sparc, den midterste for i386, ppc og sh, og den sidste for mips. A - angiver, at et signal er fraværende på den tilsvarende arkitektur.)
Indtastningerne i kolonnen "Handling" i tabellen angiver standardhandlingen for signalet som følger:
Semester: Standardhandlingen er at afslutte processen.
Ign: Standardhandlingen er at ignorere signalet.
Kerne: Standardhandling er at afslutte processen og dumpe kerne.
Hold op: Standardhandling er at stoppe processen.
Først de signaler, der er beskrevet i den originale POSIX.1-standard.
Signal | Værdi | Handling | Kommentar |
eller død af kontrollerende proces | |||
SIGINT | 2 | Semester | Afbrydelse fra tastatur |
SIGQUIT | 3 | Kerne | Afslut fra tastaturet |
SIGILL | 4 | Kerne | Ulovlig instruktion |
SIGABRT | 6 | Kerne | Afbryd signal fra abort(3) |
SIGFPE | 8 | Kerne | Flydende komma undtagelse |
SIGKILL | 9 | Semester | Drabssignal |
SIGSEGV | 11 | Kerne | Ugyldig hukommelsesreference |
SIGPIPE | 13 | Semester | Brudt rør: skriv til rør uden læsere |
SIGALRM | 14 | Semester | Timer signal fra alarm(2) |
SIGTERM | 15 | Semester | Opsigelsessignal |
SIGUSR1 | 30,10,16 | Semester | Brugerdefineret signal 1 |
SIGUSR2 | 31,12,17 | Semester | Brugerdefineret signal 2 |
SIGCHLD | 20,17,18 | Ign | Barn stoppet eller opsagt |
SIGCONT | 19,18,25 | Fortsæt, hvis du stopper | |
SIGSTOP | 17,19,23 | Hold op | Stop processen |
SIGTSTP | 18,20,24 | Hold op | Stop skrevet på tty |
SIGTTIN | 21,21,26 | Hold op | tty input til baggrundsproces |
SIGTTOU | 22,22,27 | Hold op | tty-output til baggrundsproces |
Signalerne SIGKILL og SIGSTOP kan ikke fanges, blokeres eller ignoreres.
Dernæst er signalerne ikke i POSIX.1-standarden, men beskrevet i SUSv2 og SUSv3 / POSIX 1003.1-2001.
Signal | Værdi | Handling | Kommentar |
SIGPOLL | Semester | Pollbar begivenhed (Sys V). Synonym for SIGIO | |
SIGPROF | 27,27,29 | Semester | Profileringstimeren er udløbet |
SIGSYS | 12,-,12 | Kerne | Dårligt argument til rutine (SVID) |
SIGTRAP | 5 | Kerne | Spor/brudpunktsfælde |
SIGURG | 16,23,21 | Ign | Haster tilstand på fatning (4.2 BSD) |
SIGVTALRM | 26,26,28 | Semester | Virtuelt vækkeur (4.2 BSD) |
SIGXCPU | 24,24,30 | Kerne | CPU-tidsgrænsen er overskredet (4,2 BSD) |
SIGXFSZ | 25,25,31 | Kerne | Filstørrelsesgrænsen er overskredet (4,2 BSD) |
Til og med Linux 2.2 er standardadfærden for SIGSYS, SIGXCPU, SIGXFSZ, og (på andre arkitekturer end SPARC og MIPS) SIGBUS var at afslutte processen (uden et kernedump). (På nogle andre Unices er standardhandlingen for SIGXCPU og SIGXFSZ er at afslutte processen uden en core-dump.) Linux 2.4 overholder POSIX 1003.1-2001-kravene for disse signaler, og afslutter processen med en core-dump.
Dernæst forskellige andre signaler.
Signal | Værdi | Handling | Kommentar |
SIGEMT | 7,-,7 | Semester | |
SIGSTKFLT | -,16,- | Semester | Stakfejl på coprocessor (ubrugt) |
SIGIO | 23,29,22 | Semester | I/O nu muligt (4.2 BSD) |
SIGCLD | -,-,18 | Ign | Et synonym for SIGCHLD |
SIGPWR | 29,30,19 | Semester | Strømsvigt (System V) |
SIGINFO | 29,-,- | Et synonym for SIGPWR | |
SIGLOST | -,-,- | Semester | Fillås mistet |
SIGWINCH | 28,28,20 | Ign | Vinduestilpasningssignal (4.3 BSD, Sun) |
SIGUNBRUG | -,31,- | Semester | Ubrugt signal (vil være SIGSYS) |
(Signal 29 er SIGINFO / SIGPWR på et alfa men SIGLOST på en sparc.)
SIGEMT er ikke specificeret i POSIX 1003.1-2001, men optræder ikke desto mindre på de fleste andre Unices, hvor dens standardhandling typisk er at afslutte processen med et kernedump.
SIGPWR (som ikke er specificeret i POSIX 1003.1-2001) ignoreres typisk som standard på de andre Unices, hvor det vises.
SIGIO (som ikke er specificeret i POSIX 1003.1-2001) ignoreres som standard på flere andre Unice'er.
Realtidssignaler
Linux understøtter realtidssignaler som oprindeligt defineret i POSIX.4 realtidsudvidelserne (og nu inkluderet i POSIX 1003.1-2001). Linux understøtter 32 realtidssignaler, nummereret fra 32 (SIGRTMIN) til 63 (SIGRTMAX). (Programmer bør altid henvise til realtidssignaler ved brug af notation SIGRTMIN+n, da rækkevidden af realtidssignalnumre varierer på tværs af Unices.)
I modsætning til standardsignaler har realtidssignaler ingen foruddefinerede betydninger: hele sættet af realtidssignaler kan bruges til applikationsdefinerede formål. (Bemærk dog, at LinuxThreads-implementeringen bruger de første tre realtidssignaler.)
Standardhandlingen for et ubehandlet realtidssignal er at afslutte modtagelsesprocessen.
Realtidssignaler er kendetegnet ved følgende:
- Flere forekomster af realtidssignaler kan sættes i kø. Hvis der derimod leveres flere forekomster af et standardsignal, mens dette signal i øjeblikket er blokeret, er der kun én forekomst i kø.
- Hvis signalet sendes vha sigqueue(2), kan en ledsagende værdi (enten et heltal eller en pointer) sendes med signalet. Hvis den modtagende proces etablerer en handler for dette signal ved hjælp af SA_SIGACTION flag til sigaktion(2) så kan den få disse data viasi_værdi felt af siginfo_t struktur overført som det andet argument til behandleren. Desuden si_pid og si_uid felter i denne struktur kan bruges til at opnå PID og reelle bruger-ID for processen, der sender signalet.
- Realtidssignaler leveres i en garanteret rækkefølge. Flere realtidssignaler af samme type leveres i den rækkefølge, de blev sendt. Hvis forskellige realtidssignaler sendes til en proces, leveres de med det lavest nummererede signal. (Dvs. lavt nummererede signaler har højeste prioritet.)
Hvis både standard- og realtidssignaler afventer en proces, lader POSIX det være uspecificeret, hvem der leveres først. Linux, som mange andre implementeringer, prioriterer standardsignaler i dette tilfælde.
Ifølge POSIX skal en implementering tillade mindst _POSIX_SIGQUEUE_MAX (32) realtidssignaler at blive sat i kø til en proces. Men i stedet for at placere en per-proces grænse, pålægger Linux en system-dækkende grænse for antallet af kø i realtid signaler for alle processer. Denne grænse kan ses (og med privilegium) ændres via /proc/sys/kernel/rtsig-max fil. En relateret fil,/proc/sys/kernel/rtsig-max, kan bruges til at finde ud af, hvor mange realtidssignaler der i øjeblikket er i kø.
I overensstemmelse med.
POSIX.1.
Brug mand kommando (% mand) for at se, hvordan en kommando bruges på netop din computer.