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
- minutih
- ored
- 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.