Introduzione

timeout è un'utility della riga di comando che esegue un comando specificato e lo termina se è ancora in esecuzione dopo un determinato periodo di tempo. In altre parole, consente timeout di eseguire un comando con un limite di tempo. Il comando timeout fa parte del pacchetto di utilità di base GNU che è installato su quasi tutte le distribuzioni Linux.

È utile quando si desidera eseguire un comando che non ha un'opzione di timeout integrata.

In questo articolo, spiegheremo come usare il comando timeout Linux .

Come usare il comando timeout

La sintassi per il comando timeout è la seguente:

timeout [OPTIONS] DURATION COMMAND [ARG]…

Il parametro DURATION può essere un numero intero positivo o un numero a virgola mobile, seguito da un suffisso unità opzionale:

  • s - secondi (impostazione predefinita)
  • m - minuti
  • h - ore
  • d - giorni

Quando non viene utilizzata alcuna unità, il valore predefinito è secondi. Se la durata è impostata su zero, il timeout associato è disabilitato.

Le opzioni di comando devono essere fornite prima degli argomenti.

Ecco alcuni esempi di base che dimostrano come utilizzare il comando timeout:

Termina un comando dopo 5 secondi:

timeout 5 ping 8.8.8.8

Termina un comando dopo 5 minuti:

timeout 5m ping 8.8.8.8

Termina un comando dopo un 1 e 6 secondi:

timeout 1.6m ping 8.8.8.8

Se si desidera eseguire un comando che richiede privilegi elevati come tcpdump, anteporre il comando sudo prima di timeout:

sudo timeout 300 tcpdump -n -w data.pcap

Inviare un segnale specifico

Se non viene fornito alcun segnale, 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).

Ad esempio, per inviare SIGKILL al comando ping dopo 1 minuto dovresti usare:

sudo timeout -s SIGKILL ping 8.8.8.8

Il segnale può essere specificato utilizzando il nome nome SIGKILL o dal suo numero corrispondente 9. Il seguente comando è identico al precedente:

sudo timeout -s 9 ping 8.8.8.8

Per ottenere un elenco di tutti i segnali disponibili, utilizzare il comando kill -l:

kill -l

Uccidere (kill) processi bloccati

SIGTERM, il segnale predefinito che viene inviato al superamento del limite di tempo può essere rilevato o ignorato da alcuni processi. In tali situazioni, il processo continua a essere eseguito dopo l'invio del segnale di terminazione.

Per assicurarsi che il comando monitorato venga interrotto, utilizzare l'opzione -k(--kill-after) dopo un periodo di tempo. Quando questa opzione viene utilizzata dopo il raggiungimento del limite di tempo specificato, il comando timeout invia un segnale SIGKILL al programma gestito che non può essere catturato o ignorato.

Nell'esempio seguente, timeout esegue il comando per un 1 e, se non viene terminato, lo ucciderà dopo 10 secondi:

sudo timeout -k 10 1m ping 8.8.8.8

Preservare lo stato di uscita (Exit Status)

timeout ritorna 124 quando viene raggiunto il limite di tempo. Altrimenti, restituisce lo stato di uscita del comando gestito.

Per restituire lo stato di uscita del comando anche quando viene raggiunto il limite di tempo, utilizzare l'opzione --preserve-status:

timeout --preserve-status 5 ping 8.8.8.8

Esecuzione in primo piano (Foreground)

Per impostazione predefinita, timeout esegue il comando gestito in background. Se si desidera eseguire il comando in primo piano, utilizzare l'opzione --foreground:

timeout --foreground 5m ./script.sh

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

Conclusione

Il comando timeout viene utilizzato per eseguire un determinato comando con un limite di tempo.

timeout è un semplice comando che non ha molte opzioni. In genere invocherai timeout solo con due argomenti, la durata e il comando gestito.