bitlvl
SR

Referenca Linux signala

Ukucajte naziv ili broj da pronađete signal. Poslednja kolona je izlazni kod koji školjka prijavljuje kada proces umre od tog signala (128 + broj). Tabela je na engleskom.

 
Br.NazivPodrazumevanoZnačenje / uzrokIzlazni kod
1SIGHUPTerminateHangup: the controlling terminal closed. Daemons reuse it to mean “reload configuration”.129
2SIGINTTerminateInterrupt from the keyboard (Ctrl-C).130
3SIGQUITCore dumpQuit from the keyboard (Ctrl-\); dumps core.131
4SIGILLCore dumpIllegal instruction.132
5SIGTRAPCore dumpTrace/breakpoint trap (debuggers).133
6SIGABRTCore dumpAbort signal from abort().134
7SIGBUSCore dumpBus error: bad memory access (alignment, mmap).135
8SIGFPECore dumpFloating-point exception, including integer divide by zero.136
9SIGKILLTerminateKill signal. Cannot be caught, blocked or ignored. Last resort; the process gets no chance to clean up.137
10SIGUSR1TerminateUser-defined signal 1. nginx: reopen logs; dd: print progress; Apache: graceful restart.138
11SIGSEGVCore dumpSegmentation fault: invalid memory reference.139
12SIGUSR2TerminateUser-defined signal 2. nginx: binary upgrade; Gunicorn: re-exec.140
13SIGPIPETerminateWrite to a pipe with no reader. Default kills the process, which is why `yes | head` stops.141
14SIGALRMTerminateTimer signal from alarm().142
15SIGTERMTerminateTermination request. The default for kill, systemd stop and docker stop; programs should catch it and shut down cleanly.143
16SIGSTKFLTTerminateStack fault on coprocessor (unused).144
17SIGCHLDIgnoreChild stopped or terminated.145
18SIGCONTContinueContinue if stopped (fg, kill -CONT).146
19SIGSTOPStopStop the process. Cannot be caught or ignored.147
20SIGTSTPStopStop typed at the terminal (Ctrl-Z).148
21SIGTTINStopBackground process tried to read from the terminal.149
22SIGTTOUStopBackground process tried to write to the terminal.150
23SIGURGIgnoreUrgent data on a socket.151
24SIGXCPUCore dumpCPU time limit exceeded.152
25SIGXFSZCore dumpFile size limit exceeded.153
26SIGVTALRMTerminateVirtual alarm clock.154
27SIGPROFTerminateProfiling timer expired.155
28SIGWINCHIgnoreTerminal window size changed.156
29SIGIOTerminateI/O now possible (asynchronous I/O).157
30SIGPWRTerminatePower failure.158
31SIGSYSCore dumpBad system call: the seccomp filter rejected a syscall (systemd SystemCallFilter=, Docker default profile).159

Rezultati i poruke ovog alata prikazuju se na engleskom.

Šta je signal

Signal je poruka od jedne reči koju kernel isporučuje procesu: „terminal se zatvorio“, „dirnuo si nevažeću memoriju“, „molim te, stani“. Proces može da instalira handler za većinu njih, da ih ignoriše, ili da prihvati podrazumevanu akciju, koja je obično prekid (ponekad uz core dump). Dva se ne mogu ni uhvatiti ni ignorisati: SIGKILL odmah gasi proces, a SIGSTOP ga zamrzava.

TERM naspram KILL

kill PID šalje SIGTERM: zahtev. Dobro napisan program ga hvata, završava tekući zahtev, upisuje bafere u datoteke, zatvara konekcije i izlazi; to je ono što systemd, Docker i Kubernetes šalju prvo. kill -9 šalje SIGKILL: kernel uklanja proces bez izvršavanja ijednog njegovog koda, pa zaključavanja ostaju zauzeta, privremene datoteke ostaju, a upisi u toku se gube. Koristite ga tek kada je TERM dobio vreme (systemd čeka TimeoutStopSec, Docker podrazumevano 10 sekundi) i nije uspeo.

Signali kao API

  • SIGHUP: demoni ponovo učitavaju konfiguraciju (nginx, sshd, HAProxy sa -sf semantikom kroz systemd reload). Za proces u prvom planu znači da je terminal nestao; nohup ga ignoriše.
  • SIGUSR1 / SIGUSR2: definiše ih program. nginx ponovo otvara logove na USR1 i nadograđuje svoju binarnu datoteku na USR2; dd ispisuje napredak na USR1; Gunicorn i Unicorn ih koriste za graceful restart.
  • SIGPIPE: upis u pipe čiji je čitalac izašao. Njegova podrazumevana akcija, prekid, razlog je zašto se yes | head završava i zašto serveri moraju da ga ignorišu ili obrađuju greške pri upisu.
  • SIGCHLD: dete je izašlo; roditelji pokupe decu pomoću wait(), a roditelj koji to ne radi ostavlja zombije.
  • SIGWINCH: terminalu je promenjena veličina; editori i multiplekseri ponovo iscrtavaju.

Slanje signala

kill -TERM 1234        # po nazivu (ili kill -15 1234)
kill -s USR1 $(pidof nginx)
pkill -HUP sshd        # po imenu procesa
killall -9 runaway     # svi procesi sa tim imenom
systemctl kill -s HUP myservice
docker kill --signal=SIGUSR1 container

Brojevi 1–15 su isti na svakom Unix-u; iznad toga se razlikuju po arhitekturi (SIGUSR1 je 10 na x86, a 30 na SPARC/MIPS), zbog čega skripte treba da koriste nazive.

Pitanja

Koja je razlika između SIGTERM i SIGKILL?

SIGTERM traži od procesa da izađe i može se obraditi; SIGKILL ga gasi odmah i ne može se uhvatiti. Uvek prvo probajte TERM; KILL je za procese koji su zaglavljeni.

Šta je signal 11 / SIGSEGV?

Segmentation fault: program je čitao ili pisao memoriju koja mu ne pripada, obično null ili viseći pokazivač u C/C++ kodu ili bag u nativnoj ekstenziji. Školjka prijavljuje izlazni kod 139.

Zašto je moj proces izašao sa 137 kad niko nije pokrenuo kill -9?

Kernel jeste: out-of-memory killer šalje SIGKILL najvećem procesu kada ponestane memorije, a container runtime-ovi rade isto kada se dostigne ograničenje memorije. Proverite dmesg ili OOMKilled zastavicu kontejnera.

Mogu li da ignorišem SIGINT da Ctrl-C ne zaustavlja moju skriptu?

Da: trap "" INT u bash-u, ili signal.signal(SIGINT, SIG_IGN) u Python-u. Obično je bolje uhvatiti ga i počistiti pre izlaska, tako da korisnik i dalje može da zaustavi skriptu.