I segnali in Linux

Mattepuffo's logo
I segnali in Linux

I segnali in Linux

Torno dopo un pò con una mini guida sui segnali in Linux.

Un segnale è un evento spedito dal kernel a un programma in esecuzione.

I segnali posso arrivare in qualsiasi momento e un software può scegliere cosa fare quando arriva: può decidere di ignorarlo o può decidere di eseguire un signal handler e continuare con quello che faceva.

Esistono 31 segnali differenti ed è possibili vederli con:

kill -l

Di questi ce ne sono 6 che devono essere conosciuti dagli amministratori di sistema:

  • SIGHUP usato per dire a un demone di ricaricarsi perchè i suoi file di configurazione sono stati cambiati
  • SIGINT mandato a un processo in foreground quando viene battuto Ctrl+C sulla tastiera. Molti programmi però ignoarano questa azione, come ad esempio il comando less
  • SIGQUIT spedito tramite Ctrl+\; anche questo termina il processo ma fa in modo che la shell scriva un file core per aiutare il cosidetto post-mortem debug
  • SIGTERM è il segnale di default del comando kill. Potete consederalo come una richiesta soft di chiusura e uscita. E' inviato da init a tutti i processi in esecuzione durante lo spegnimento
  • SIGKILL è usato anch'esso da init ma solo quanto SIGTERM non funziona. Questo segnale non può essere catturato o ignorato da nessun processo e la sua azione consiste nel terminare il processo. E' usato come ultima risorsa solo quando i due precedenti falliscono, in quanto SIGKILL, al contrario di SIGTERM, non da ai processi la possibilità di sistemarsi
  • SISGEV (segmentation voilation) è creato internamente al programma stesso, e non esternamente come gli altri. Viene creato quando il programma tenta di accedere a un indirizzo di memoria non più allocato ad esso. L'azione di default è quella di chiudere il programma

Questi sono i più importanti, ma non significa che non bisogna conoscere gli altri!

Vediamo brevemente come è possibile inviare segnali.

In generale abbiamo detto che sono inviati dal kernel, ma possono origine in luoghi diversi.

Come detto sopra da console si può usare il comando kill:

$ kill -SIGTERM 15365 12984

I numeri sono gli identificativi dei processi a cui spedire i segnali.

Ovviamente è possibile spedire segnali solo ai processi di proprietà dell'utente che esegue kill.

In caso contrario lanciato da root stando però molto attenti a quale processo state inviando il segnale!

In alternativa a kill si può usare pkill.

La differenza sta che per il primo bisogna sapere il numero identificativo, mentre per il secondo si possono usare altri modi:

$ pkill -SIGHUP syslog-ng

$ pkill -SIGTERM -U matte

$ pkill -SIGKILL -P 16754

Il primo invia SIGHUP a tutti i processi che stanno eseguendo syslog-ng; il secondo invia SIGTERM a tutti i processi dell'utente matte; il terzo "uccide" tutti i processi che hanno come processo padre quello identificato dal numero 16754.


Condividi

Commentami!