In questo articolo

  • Utilizzo dei segnali su Linux
  • Dettagli tecnici
  • Segnali standard
  • Segnali in tempo reale

Linux supporta sia i segnali POSIX affidabili (di seguito, “segnali standard”) che i segnali POSIX in tempo reale.

Utilizzo dei segnali su Linux

I segnali su un sistema Linux indicano al sistema operativo come gestire un programma o un processo in esecuzione. Quando si chiude un programma normalmente, questo invia effettivamente un segnale al sistema dicendogli di chiudere il programma. Puoi farlo anche manualmente.

Inizia cercando un processo che vuoi chiudere. Puoi farlo con:

ps aux | grep -i 

class=”sintassi-ql”>

Quindi, se vuoi chiudere Firefox dalla riga di comando, inserisci:

ps aux | grep -i firefox

class=”sintassi-ql”>

Riceverai un enorme elenco di processi da Firefox perché è un’applicazione multithread. Cerca il processo di base per /usr/lib/firefox. Di solito è il primo.

Se lo trovi travolgente, puoi anche usarlo pgrep. Funziona in modo simile ma ti fornisce solo gli ID di processo.

pgrep firefox

L’ID di processo più basso sarà il processo di base di cui hai bisogno.

Quando lo hai, trova il numero ID del processo. La prima cosa elencata sarà sempre l’utente che esegue il processo. Il prossimo sarà l’ID del processo. Con quello in mano, puoi inviare a SIGTERM segnalare al processo di interromperlo utilizzando il comando kill.

kill -SIGTERM 4790

Ogni segnale ha anche un numero corrispondente per l’abbreviazione. Il numero per SIGTERM è 15quindi puoi usarlo proprio come la parola intera.

kill -15 4790

class=”sintassi-ql”>

SIGTERM è in realtà l’azione predefinita del comando kill. Di conseguenza, in realtà non è necessario specificarlo affatto. Basta usare:

kill 4790

class=”sintassi-ql”>

Otterrai lo stesso identico risultato.

Va tutto bene se il processo è reattivo, ma probabilmente non interromperai un processo reattivo in questo modo, almeno non su un desktop. Quindi, cosa fai con un processo che non risponde? Ci sono un sacco di possibili segnali. Per un’idea migliore di quanto sia ampia la gamma, cercali.

kill -l

class=”sintassi-ql”>

Sì, ce ne sono molti. Per fortuna, non toccherai la stragrande maggioranza, a meno che tu non inizi a sviluppare o scrivere script di amministrazione del sistema. Il più delle volte, quando SIGTERM non riesce a fermare un processo che non risponde, guarderai all’equivalente Linux di Ctrl+Alt+Canc,SIGKILL.

A differenza del famigerato gestore di processi Ctrl+Alt+Cancella, SIGKILL funziona davvero. In effetti, ha lo scopo di ignorare tutti gli altri fattori e abbattere il processo offensivo, qualunque cosa accada. Ciò significa anche che SIGKILL può essere pericoloso se sbagli il processo.

Inizia esattamente allo stesso modo, cercando l’ID del processo.

pgrep firefox

class=”sintassi-ql”>

Ora, invece di usare SIGTERM per fermare il processo, usa il più distruttivo SIGKILL.

kill -SIGKILL 4790

class=”sintassi-ql”>

Anche se il processo è completamente bloccato, dovrebbe chiudersi entro pochi secondi.

Proprio come con SIGTERM, c’è un numero corrispondente a SIGKILL. In questo caso, lo è 9.

kill -9 4790

class=”sintassi-ql”>

Proprio come prima, il processo dovrebbe interrompersi quasi immediatamente.

Dovresti anche essere consapevole SIGINT. Questa è un’interruzione dalla tastiera ed è più comando di quanto pensi nella riga di comando. Quando premi CTRL+C per fermare un processo da una finestra di terminale, stai effettivamente emettendo un SIGINT. Il suo codice è 2e puoi usarlo proprio come gli altri con il comando kill.

kill -2 4790

class=”sintassi-ql”>

Questo non è troppo comune poiché è molto più probabile che tu usi Ctrl + C, ma è bene esserne consapevoli.

Questi sono di gran lunga i segnali più comuni che incontrerai nel tuo uso quotidiano di Linux. Per una ripartizione più tecnica degli altri segnali, continua con la sezione successiva.

I Dettagli Tecnici

Se sei un amministratore di sistema o stai cercando di sviluppare per Linux, probabilmente vorrai approfondire i dettagli tecnici dietro il sistema di segnali su Linux. La prossima sezione esplora la ripartizione tecnica completa dei segnali Linux. Non hai assolutamente bisogno di queste informazioni per usare Linux sul tuo desktop, ma se intendi esplorare il funzionamento interno del sistema, può rivelarsi inestimabile.

Segnali standard

Linux supporta i segnali standard elencati di seguito. Diversi numeri di segnale dipendono dall’architettura, come indicato nella colonna “Valore”. (Dove sono dati tre valori, il primo è solitamente valido per alpha e sparc, quello centrale per i386, ppc e sh e l’ultimo per mips. A – indica che un segnale è assente sull’architettura corrispondente.)

Le voci nella colonna “Azione” della tabella specificano l’azione predefinita per il segnale, come segue:

Termine: L’azione predefinita è terminare il processo.

Ign: L’azione predefinita è ignorare il segnale.

Nucleo: L’azione predefinita è terminare il processo ed eseguire il dump del core.

Fermare: L’azione predefinita è interrompere il processo.

In primo luogo, i segnali descritti nello standard POSIX.1 originale.

Segnale Valore Azione Commento
o morte del processo di controllo
SIGINT 2 Termine Interruzione da tastiera
SIGQUIT 3 Nucleo Esci dalla tastiera
SIGILL 4 Nucleo Istruzione illegale
SIGABRT 6 Nucleo Segnale di interruzione da abortire(3)
SIGFPE 8 Nucleo Eccezione in virgola mobile
SIGKILL 9 Termine Segnale di uccisione
SIGSEGV 11 Nucleo Riferimento di memoria non valido
SIGPIPE 13 Termine Pipe rotta: scrivi nella pipe senza lettori
SIGALRM 14 Termine Segnale timer da allarme(2)
SIGTERM 15 Termine Segnale di terminazione
SIGUSR1 30,10,16 Termine Segnale definito dall’utente 1
SIGUSR2 31,12,17 Termine Segnale definito dall’utente 2
SIGCHLD 20,17,18 Ign Bambino fermato o terminato
SIGCONT 19,18,25 Continua se interrotto
SIGSTOP 17,19,23 Fermare Arresta il processo
SIGTSTP 18,20,24 Fermare Stop digitato a tty
SIGTTIN 21,21,26 Fermare tty input per il processo in background
SIGTTOU 22,22,27 Fermare tty output per il processo in background

I segnaliSIGKILLeSIGSTOPnon può essere catturato, bloccato o ignorato.

Successivamente i segnali non nello standard POSIX.1 ma descritti in SUSv2 e SUSv3 / POSIX 1003.1-2001.

Segnale Valore Azione Commento
SIGPOL Termine Evento pollable (Sys V). Sinonimo di SIGIO
SIGPROF 27,27,29 Termine Tempo di profilazione scaduto
SIGSYS 12,-,12 Nucleo Argomento errato per la routine (SVID)
SIGTRAPPOLA 5 Nucleo Trappola traccia/punto di interruzione
SIGURG 16,23,21 Ign Condizione urgente sulla presa (4.2 BSD)
SIGVTALRM 26,26,28 Termine Sveglia virtuale (4.2 BSD)
CPU SIGX 24,24,30 Nucleo Limite di tempo CPU superato (4,2 BSD)
SIGXFSZ 25,25,31 Nucleo Limite di dimensione del file superato (4,2 BSD)

Fino a Linux 2.2 incluso, il comportamento predefinito perSIGSYS,CPU SIGX,SIGXFSZ,e (su architetture diverse da SPARC e MIPS)SIGBUSdoveva terminare il processo (senza un core dump). (Su alcuni altri Unice l’azione predefinita perCPU SIGXeSIGXFSZconsiste nel terminare il processo senza un core dump.) Linux 2.4 è conforme ai requisiti POSIX 1003.1-2001 per questi segnali, terminando il processo con un core dump.

Successivamente, vari altri segnali.

Segnale Valore Azione Commento
SIGEMT 7,-,7 Termine
SIGSTKFLT -,16,- Termine Errore stack sul coprocessore (non utilizzato)
SIGIO 23,29,22 Termine I/O ora possibile (4.2 BSD)
SIGCLD -,-,18 Ign Sinonimo di SIGCHLD
SIGPWR 29,30,19 Termine Interruzione di corrente (Sistema V)
SIGFO 29,-,- Sinonimo di SIGPWR
SIGLOST -,-,- Termine Blocco file perso
SIGWINCH 28,28,20 Ign Segnale di ridimensionamento della finestra (4.3 BSD, Sun)
SIGUNUSO -,31,- Termine Segnale non utilizzato (sarà SIGSYS)

(Il segnale 29 èSIGFO/SIGPWRsu un alfa maSIGLOSTsu uno stelo.)

SIGEMTnon è specificato in POSIX 1003.1-2001, ma appare comunque sulla maggior parte degli altri Unice, dove la sua azione predefinita è in genere di terminare il processo con un core dump.

SIGPWR(che non è specificato in POSIX 1003.1-2001) viene in genere ignorato per impostazione predefinita su quegli altri Unice in cui appare.

SIGIO(che non è specificato in POSIX 1003.1-2001) viene ignorato per impostazione predefinita su molti altri Unice.

Segnali in tempo reale

Linux supporta i segnali in tempo reale come originariamente definiti nelle estensioni in tempo reale POSIX.4 (e ora inclusi in POSIX 1003.1-2001). Linux supporta 32 segnali in tempo reale, numerati da 32 (SIGRTMIN) a 63 (SIGRTMAX). (I programmi dovrebbero sempre fare riferimento a segnali in tempo reale usando la notazioneSIGRTMIN+n, poiché l’intervallo dei numeri dei segnali in tempo reale varia tra Unice.)

A differenza dei segnali standard, i segnali in tempo reale non hanno significati predefiniti: l’intero set di segnali in tempo reale può essere utilizzato per scopi definiti dall’applicazione. (Si noti, tuttavia, che l’implementazione di LinuxThreads utilizza i primi tre segnali in tempo reale.)

L’azione predefinita per un segnale in tempo reale non gestito è terminare il processo di ricezione.

I segnali in tempo reale si distinguono per:

  1. È possibile accodare più istanze di segnali in tempo reale. Al contrario, se vengono fornite più istanze di un segnale standard mentre quel segnale è attualmente bloccato, viene accodata solo un’istanza.
  2. Se il segnale viene inviato utilizzandosigla(2), un valore di accompagnamento (un intero o un puntatore) può essere inviato con il segnale. Se il processo di ricezione stabilisce un gestore per questo segnale utilizzando ilSA_SIGAZIONEbandiera asigazione(2) allora può ottenere questi dati tramite ilsi_valorecampo delsigninfo_tstruttura passata come secondo argomento al gestore. Inoltre, ilsi_pidesi_uidi campi di questa struttura possono essere utilizzati per ottenere il PID e l’ID utente reale del processo che invia il segnale.
  3. I segnali in tempo reale vengono consegnati in un ordine garantito. Più segnali in tempo reale dello stesso tipo vengono consegnati nell’ordine in cui sono stati inviati. Se diversi segnali in tempo reale vengono inviati a un processo, vengono inviati a partire dal segnale con il numero più basso. (Cioè, i segnali con numero basso hanno la priorità più alta.)

Se sia i segnali standard che quelli in tempo reale sono in attesa per un processo, POSIX non viene specificato quale viene consegnato per primo. Linux, come molte altre implementazioni, in questo caso dà la priorità ai segnali standard.

Secondo POSIX, un’implementazione dovrebbe consentire almeno _POSIX_SIGQUEUE_MAX (32) segnali in tempo reale di essere accodati a un processo. Tuttavia, invece di porre un limite per processo, Linux impone un limite a livello di sistema al numero di segnali in tempo reale in coda per tutti i processi. Questo limite può essere visualizzato (e con privilegio) modificato tramite il/proc/sys/kernel/rtsig-maxfile. Un file correlato,/proc/sys/kernel/rtsig-max,può essere utilizzato per scoprire quanti segnali in tempo reale sono attualmente in coda.

CONFORME A

POSIX.1

Utilizzare iluomocomando (% uomo) per vedere come viene utilizzato un comando su un determinato computer.

Leave a Reply