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