Come utilizzare il comando timeout su Linux

OK, è abbastanza tempo per il computer. Puoi dare limiti di tempo ai processi, impostando un tempo massimo per cui possono essere eseguiti con il comando timeout. Ecco un tutorial per porre limiti all’esecuzione di programmi con questo comando.

Cosa fa il timeout per te?

Il comando timeout ti permette di impostare un limite al periodo di tempo un programma verrà eseguito per. Ma perché dovresti farlo?

Un caso è quando sai esattamente per quanto tempo vuoi che un processo venga eseguito. Un caso d’uso comune è quello di avere il controllo del timeout su un programma di registrazione o acquisizione dati in modo che i file di registro non divorino incessantemente lo spazio del disco rigido.

Un altro caso è quando non sai per quanto tempo vuoi che un processo venga eseguito, ma sai che non vuoi che venga eseguito indefinitamente. Potresti avere l’abitudine di impostare i processi in esecuzione, ridurre a icona la finestra del terminale e dimenticarli.

Alcuni programmi, anche semplici utilità, possono generare traffico di rete a livelli che possono ostacolare le prestazioni della rete. Oppure possono vincolare le risorse su un dispositivo di destinazione, rallentandone le prestazioni. (ping, ti sto guardando.) Lasciare questi tipi di programmi in esecuzione per lunghi periodi mentre sei lontano dal tuo computer è una cattiva pratica.

timeout fa parte di GNU Core Utils quindi i sistemi operativi Linux e Unix come macOS hanno tutti il ​​timeout integrato. Non c’è niente da installare; puoi usarlo appena estratto dalla scatola.

Guida introduttiva al timeout

Ecco un semplice esempio. Ad esempio, con le sue opzioni predefinite della riga di comando, il comando ping verrà eseguito fino a quando non lo interrompi premendo Ctrl + C. Se non lo interrompi, continuerà.

ping 192.168.4.28

Utilizzando il timeout, possiamo assicurarci che il ping non venga eseguito continuamente, masticando la larghezza di banda della rete e disturbando qualsiasi dispositivo su cui viene eseguito il ping.

Il prossimo comando utilizza il timeout per limitare il tempo di ping. Consentiamo 15 secondi di tempo di esecuzione per il ping.

timeout 15 ping 192.168.4.28

timeout 15 ping 192.168.4.28 in una finestra di terminale

Dopo 15 secondi di timeout termina la sessione di ping e si torna al prompt della riga di comando.

terminato la sessione di ping in una finestra di terminale

Utilizzo del timeout con altre unità di tempo

Si noti che non è stato necessario aggiungere una “s” dietro il 15. timeout presuppone che il valore sia in secondi. Potresti aggiungere una “s”, ma non fa davvero differenza.

Per utilizzare un valore temporale misurato in minuti, ore o giorni, aggiungi una “m”, una “h” o una “d”.

Per eseguire il ping per tre minuti, utilizzare il seguente comando:

timeout 3m ping 192.168.4.28

timeout 3m ping 192.168.4.28 in una finestra di terminale

ping verrà eseguito per tre minuti prima che il timeout intervenga e interrompa la sessione di ping.

sessione di ping in esecuzione in una vedova terminale

Limitazione dell’acquisizione dei dati con timeout

Alcuni file di acquisizione dati possono crescere molto rapidamente. Per evitare che tali file diventino ingombranti o addirittura problematici in termini di dimensioni, limitare il tempo di esecuzione del programma di acquisizione.

In questo esempio, stiamo usando tcpdump, a acquisizione del traffico di rete attrezzo. Sulle macchine di prova su cui è stato ricercato questo articolo, tcpdump era già installato in Ubuntu Linux e Fedora Linux. Doveva essere installato su Manjaro Linux e Arch Linux, con il seguente comando:

sudo pacman -Syu tcpdump

sudo pacman -Syu tcpdump in una finestra di terminale

Possiamo eseguire tcpdump per 10 secondi con le sue opzioni predefinite e reindirizzare il suo output a un file chiamato capture.txt con il seguente comando:

timeout 10 sudo tcpdump > capture.txt

timeout 10 sudo tcpdump> capture.txt in una finestra di terminale “width =” 646 ″ height = “77 ″ onload =” pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this); ”  onerror = “this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”> </p>
<p> (tcpdump ha le sue opzioni per salvare il traffico di rete catturato in un file. Questo è un trucco veloce perché noi stiamo discutendo di timeout, non di tcpdump.) </p>
<p> tcpdump inizia a catturare il traffico di rete e aspettiamo 10 secondi.  E 10 secondi vanno e vengono e tcpdump è ancora in esecuzione e capture.txt sta ancora crescendo di dimensioni.  Ci vorrà un frettoloso Ctrl + C per fermare tcpdump. </p>
<p> Controllare la dimensione di capture.txt con ls mostra che è cresciuta fino a 209K in pochi secondi.  Quel file stava crescendo velocemente! </p>
<pre> ls -lh capture.txt </pre>
<p> <img loading =

Quello che è successo? Perché il timeout non ha interrotto tcpdump?

Ha tutto a che fare con i segnali.

Invio del segnale giusto

Quando timeout vuole fermare un programma, invia il file Segnale SIGTERM. Questo chiede cortesemente al programma di terminare. Alcuni programmi possono scegliere di ignorare il segnale SIGTERM. Quando ciò accade, dobbiamo dire al timeout di essere un po ‘più energico.

Possiamo farlo chiedendo al timeout di inviare invece il segnale SIGKILL.

Il segnale SIGKILL non può essere “catturato, bloccato o ignorato”: passa sempre. SIGKILL non chiede cortesemente al programma di fermarsi. SIGKILL si nasconde dietro l’angolo con un cronometro e un cosh.

Possiamo usare l’opzione -s (signal) per dire al timeout di inviare il segnale SIGKILL.

timeout -s SIGKILL 10 sudo tcpdump > capture.txt

timeout -s SIGKILL 10 sudo tcpdump> capture.txt in una finestra di terminale “width =” 646 ″ height = “167” onload = “pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”  onerror = “this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”> </p>
<p> Questa volta, non appena sono trascorsi 10 secondi, tcpdump viene interrotto. </p>
<p> < img caricamento =

Chiedere cortesemente prima

Possiamo chiedere timeout per provare a fermare il programma usando SIGTERM e per inviare SIGKILL solo se SIGTERM non ha funzionato.

Per fare questo, usiamo l’opzione -k (kill after). L’opzione -k richiede un valore temporale come parametro.

In questo comando, chiediamo al timeout di far funzionare dmesg per 30 secondi e di terminarlo con il segnale SIGTERM. Se dmesg è ancora in esecuzione dopo 40 secondi, significa che il SIGTERM diplomatico è stato ignorato e il timeout dovrebbe inviare SIGKILL per completare il lavoro.

dmesg è un’utilità che può monitorare i messaggi del ring buffer del kernel e visualizzarli in una finestra di terminale.

timeout -k 40 30 dmseg -w

timeout -k 40 30 dmseg -w in una finestra di terminale

dmesg funziona per 30 secondi e si ferma quando riceve il segnale SIGTERM.

Uscita da dmesg in una finestra di terminale

Sappiamo che non è stato SIGKILL a fermare dmesg perché SIGKILL lascia sempre un necrologio di una sola parola nella finestra del terminale: “Ucciso”. In questo caso non è successo.

Recupero del codice di uscita del programma

I programmi ben educati restituiscono un valore alla shell quando terminano. Questo è noto come codice di uscita. Tipicamente questo è usato per dire alla shell – oa qualunque processo abbia avviato il programma – se il programma ha incontrato dei problemi durante l’esecuzione.

timeout fornisce il proprio codice di uscita, ma potrebbe non interessarci. Probabilmente siamo più interessati al codice di uscita dal processo controllato dal timeout.

Questo comando consente di eseguire ping per cinque secondi. Sta eseguendo il ping di un computer chiamato Nostromo, che si trova sulla rete di prova utilizzata per la ricerca di questo articolo.

timeout 5 ping Nostromo.local

timeout 5 ping Nostromo.local in una finestra di terminale

Il comando viene eseguito per cinque secondi e il timeout lo termina. Possiamo quindi controllare il codice di uscita usando questo comando:

echo $?

output di ping ed echo $?  in una finestra di terminale

Il codice di uscita è 124. Questo è il valore utilizzato dal timeout per indicare che il programma è stato terminato utilizzando SIGTERM. Se SIGKILL termina il programma, il codice di uscita è 137.

Se interrompiamo il programma con Ctrl + C il codice di uscita dal timeout è zero.

timeout 5 ping Nostromo.local
echo $?

timeout 5 ping Nostromo.local in una finestra di terminale usando Ctrl + C

Se l’esecuzione del programma termina prima che il timeout lo termini, timeout può passare il codice di uscita dal programma alla shell.

Affinché ciò avvenga, il programma deve arrestarsi da solo (in altre parole, non viene terminato per timeout) e dobbiamo utilizzare l’opzione –preserve-status.

Se usiamo l’opzione -c (count) con un valore di cinque ping attiverà solo cinque richieste. Se diamo al timeout una durata di un minuto, il ping sarà definitivamente terminato da solo. Possiamo quindi controllare il valore di uscita usando echo.

timeout --preserve-status 1m ping -c 5 Nostromo.local
echo $?

timeout --preserve-status 1m ping -c 5 Nostromo.local in una finestra di terminale

ping completa le sue cinque richieste di ping e termina. Il codice di uscita è zero.

Per verificare che il codice di uscita provenga da ping, forziamo il ping a generare un codice di uscita diverso. Se proviamo a inviare richieste ping a un indirizzo IP inesistente, il ping fallirà con un codice di uscita di errore. Possiamo quindi usare echo per verificare che il codice di uscita sia diverso da zero.

timeout --preserve-status 1m ping -c 5 NotHere.local
echo $?

timeout --preserve-status 1m ping -c 5 NotHere.local in una finestra di terminale

Il comando ping ovviamente non può raggiungere il dispositivo inesistente, quindi segnala l’errore e si chiude. Il codice di uscita è due. Questo è il codice di uscita utilizzato da ping per gli errori generali.

Impostazione delle regole di base

timeout consiste nel fornire alcuni limiti all’esecuzione dei programmi. Se c’è un pericolo che i file di registro possano sovraccaricare il tuo disco rigido o che potresti dimenticare di aver lasciato uno strumento di rete in esecuzione, avvolgili in timeout e lascia che il tuo computer si autoregoli.