Visualizzazione post con etichetta SIGTERM. Mostra tutti i post
Visualizzazione post con etichetta SIGTERM. Mostra tutti i post

sabato 30 luglio 2022

Linux: Comando timeout

Il comando timeout fa parte del pacchetto GNU core utilities installato in quasi tutte le distribuzioni Linux e può essere utilizzato nel caso in cui si vuole eseguire un comando che non dispone di un'opzione di timeout incorporata.
L'utility a riga di comando timeout, infatti, consente di eseguire un comando specificato e terminarlo, se è ancora in esecuzione, dopo un determinato periodo di tempo. 

Sintassi

timeout [OPZIONI] DURATA COMMANDO [ARG]…

La DURATA può essere specificata con un numero intero positivo o un numero in virgola mobile, seguito da un suffisso opzionale di unità:
s - secondi (default)
m - minuti
h - ore
d - giorni

Se non viene specificata alcuna unità, l'impostazione predefinita è secondi. Se la durata è impostata a zero, il timeout associato è disabilitato.

Utilizzo di timeout

Di seguito viene mostrato, con alcuni semplici esempi, come può essere utilizzato il comando di timeout.

timeout 5 ping 8.8.8.8
Termina il comando ping dopo 5 secondi
Linux, timeout
FIG 1 - Linux, timeout

timeout 1.2m ping 8.8.8.8
Termina il comando ping dopo 1 minuto e 20 secondi

Per eseguire un comando che richiede privilegi elevati basta anteporre sudo al comando timeout.
sudo timeout 1.2m ping 8.8.8.8

Invio di uno specifico segnale

Se non viene specificato alcun segnale, il timeout invia il segnale SIGTERM al comando gestito quando viene raggiunto il limite di tempo. È possibile specificare quale segnale inviare utilizzando l'opzione -s (--signal).
Per visualizzare l'elenco di tutti i segnali disponibili si utilizza il comando
kill -l
kill, elenco segnali disponibili
FIG 2 - kill, elenco segnali disponibili


sudo timeout 1m -s SIGKILL ping 8.8.8.8
sudo timeout 1m -s 9 ping 8.8.8.8
I comandi sopra riportati inviano il segnale SIGKILL per terminare il comando ping dopo un minuto. Il segnale può essere specificato all'interno del comando indicando il nome (SIGKILL) oppure il numero corrispondente (9).

Forzare la chiusura del processo con l'opzione -k

SIGTERM può essere catturato o ignorato da alcuni processi. In queste situazioni, il processo continuerà a funzionare dopo l'invio del segnale di terminazione.
Per assicurarsi che il comando monitorato venga terminato, va utilizzata l'opzione -k (--kill-after) seguita da un periodo di tempo. In questo modo, dopo il raggiungimento del limite di tempo indicato, il comando di timeout invia il segnale SIGKILL al programma gestito che non può essere catturato o ignorato.

Nell'esempio seguente, timeout esegue il comando ping per un minuto e, se non viene terminato, lo termina dopo dieci secondi.
sudo timeout -k 10 1m ping 8.8.8.8

Return code

Il comando timeout restituisce, come codice di ritorno, 124 quando viene raggiunto il limite di tempo, in caso contrario viene restituito il codice di ritorno del comando gestito.

Per visualizzare il return code del comando anche quando viene raggiunto il limite di tempo, si  utilizza l'opzione --preserve-status:
timeout --preserve-status 10 ping 8.8.8.8

Eseguire il comando in primo piano

Per impostazione predefinita, il timeout esegue il comando gestito in background. Per eseguire il comando in primo piano si utilizza l'opzione --foreground:
timeout --foreground 3m ./scriptfile.sh

Questa opzione è utile quando si vuole eseguire un comando interattivo che richiede l'input dell'utente.