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.

Linux procesliste Firefox

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.

Linux pgrep Firefox

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

SIGTERM signal til processen for at stoppe den ved at bruge dræbe kommando.

dræbe -SIGTERM 4790. 
Linux SIGTERM Firefox

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
Linux-signalliste

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.

Linux SIGKILL Firefox

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:

  1. 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ø.
  2. 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.
  3. 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.