Un comando timeout
è un'utilità della riga di comando che esegue un comando specificato e lo interrompe se è ancora in esecuzione dopo un certo periodo di tempo. In altre parole, il comando timeout
ti consente di eseguire il comando con un timeout specificato. Il comando timeout
fa parte del pacchetto di utilità GNU di base che è installato su quasi tutte le distribuzioni Linux.
Questo comando è utile quando desideri eseguire un comando che non dispone di un'opzione di timeout incorporata o interrompere un processo dopo un certo periodo di esecuzione.
In questo articolo spiegheremo come usare i comandi timeout
nel terminale Linux.
Come utilizzare il comando di timeout
La sintassi per il comando di timeout è la seguente:
timeout [OPTIONS] DURATION COMMAND [ARG]…
DURATION
può essere un numero intero positivo o in virgola mobile, seguito da un suffisso di unità opzionale:
s
– secondi (secondi) (questa è l'opzione predefinita)m
– minuti (minuti)h
– ore (ore)d
– giorni (giorni)
Quando non vengono utilizzate unità, l'impostazione predefinita è secondi. Se la durata è impostata a zero, il timeout associato è disabilitato.
Le opzioni di comando devono essere fornite prima dell'argomento.
Ecco alcuni esempi di base che mostrano come usare il comando timeout
:
- Interrompi il comando
ping
dopo cinque secondi::timeout 5 ping 8.8.8.8 - Interrompi il comando dopo cinque minuti:timeout 5m ping 8.8.8.8
- Interrompi il comando dopo un minuto e sei secondi:timeout 1.1m ping 8.8.8.8
Se vuoi eseguire un comando che richiede privilegi come tcpdump
, aggiungi un prefisso sudo
prima del comando timeout
:
sudo timeout 300 tcpdump -n -w data.pcap
Invio di segnali specifici
Se non viene dato alcun segnale, timeout
utilizzerà il segnale SIGTERM per il comando specificato quando viene raggiunto il timeout. Puoi specificare quale segnale usare usando -s
( --signal
) opzione.
Ad esempio, per inviare SIGKILL
a un comando ping
dopo un minuto, puoi usare il comando:
sudo timeout -s SIGKILL ping 8.8.8.8
Il segnale può essere specificato dal suo nome come SIGKILL
o un numero come 9
. Il comando seguente è identico al precedente:
sudo timeout -s 9 ping 8.8.8.8
Per ottenere un elenco di tutti i segnali disponibili, utilizza il comando kill -l
:
kill -l
Uccidi il processo bloccato
SIGTERM
, il segnale predefinito inviato al superamento del timeout potrebbe essere rilevato o ignorato da alcuni processi. In tale situazione, il processo continua a essere eseguito dopo l'invio del segnale di terminazione.
Per assicurarti che il comando monitorato si sia interrotto, usa l'opzione -k
( --kill-after
) seguito da un periodo di tempo. Quando questa opzione viene utilizzata dopo che è stato raggiunto il timeout specificato, il comando timeout
invia un segnale SIGKILL
al programma corrispondente all'input dell'utente.
Nell'esempio seguente, è timeout
esegue il comando per un minuto e, se non viene terminato, "ucciderà" il programma dopo dieci secondi:
sudo timeout -k 10 1m ping 8.8.8.8
timeout -k “./test.sh”
Il processo verrà interrotto una volta raggiunto il limite di tempo indicato anche se è bloccato.
Mantenimento dello stato di uscita
timeout
restituirà 124
quando il tempo limite è stato raggiunto. Altrimenti, il comando timeout
restituirà lo stato di uscita del comando gestito.
Per restituire lo stato di uscita del comando anche al raggiungimento del timeout, utilizzare l'opzione --preserve-status
:
timeout --preserve-status 5 ping 8.8.8.8
Esecuzione dei comandi in primo piano
Per impostazione predefinita, è timeout
esegue un comando in background. Se vuoi eseguire il comando in primo piano, usa l'opzione --foreground
:
timeout --foreground 5m ./script.sh
Questa opzione è utile quando vuoi eseguire comandi interattivi che richiedono l'input dell'utente.
Conclusione
Il comando è timeout
utilizzato per eseguire un determinato comando con un limite di tempo secondo la volontà dell'utente.
Comandi timeout
sono comandi semplici che non hanno molte opzioni. Di solito utilizzerai un comando timeout
con solo due argomenti, durata e il comando che si verificherà.