Come usare il comando timeout in Linux

Contenuti

Laptop Linux che mostra un prompt bash

Concordare, abbastanza tempo al computer. Puoi dare ai processi limiti di tempo, stabilendo un tempo massimo eseguibile con il timeoutcomando. Ecco un tutorial per porre limiti all'esecuzione di programmi con questo comando.

Cosa ti fa il tempo di attesa?

il timeout il comando ti abilita fissare un limite alla quantità di tempo verrà eseguito un programma. Ma, Perché vorresti farlo??

Un caso è quando sai esattamente per quanto tempo vuoi che una procedura venga eseguita. Un caso d'uso comune è avere timeout controllare un programma di registrazione o acquisizione dati in modo che i file di registro non consumino inesorabilmente lo spazio sul disco rigido.

Un altro caso è quando non sai per quanto tempo vuoi che una procedura venga eseguita, ma sai che non vuoi che funzioni all'infinito. Potresti avere l'abitudine di configurare i processi in esecuzione, minimizzare la finestra del terminale e dimenticarsene.

Alcuni programmi, anche semplici utilità, può generare traffico di rete a livelli che possono ostacolare le prestazioni della tua rete. Oppure possono congelare le risorse su un dispositivo di destinazione, che rallenta le tue prestazioni. (ping, Ti sto guardando.) Lasciare questi tipi di programmi in esecuzione per lunghi periodi di tempo mentre non sei al computer è una cattiva pratica..

timeout è parte di Utilità GNU Core perché, Sistemi operativi simili a Linux e Unix, come macOS, hanno un tempo di attesa incorporato. Non c'è niente da installare; puoi usarlo subito fuori dalla scatola.

A cominciare dai tempi di attesa

Qui c'è un semplice esempio. Come esempio, con le opzioni della riga di comando predefinite, il ping Il comando verrà eseguito finché non lo interrompi premendo Ctrl + C. Se non interrompi, continua.

ping 192.168.4.28

Attraverso l'uso timeout, possiamo essere sicuri ping non funziona a intermittenza, masticare la larghezza di banda della rete e infastidire qualsiasi dispositivo che viene sottoposto a ping.

Questo prossimo comando usa timeout al limite di tempo ping. noi permettiamo 15 secondi di runtime per ping.

tempo scaduto 15 ping 192.168.4.28

Dopo 15 secondi timeout finisce il ping sessione e tornare alla riga di comando.

Utilizzo del timeout con altre unità di tempo

Tieni presente che non è stato necessario aggiungere a “S” dietro 15. timeout presuppone che il valore sia in secondi. Potrei aggiungere a “S”, ma in realtà non fa differenza.

Per utilizzare un valore di tempo misurato in minuti, ore o giorni, Aggiungi uno “m”, un “h” Non è necessario aggiungere l'estensione “D”.

Per far funzionare il ping per tre minuti, usa il seguente comando:

timeout 3m ping 192.168.4.28

ping funzionerà per tre minuti prima timeout interviene e ferma il ping sessione.

ping sessione in esecuzione su un terminale vedovo

Limita l'acquisizione dei dati con il timeout

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

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

sudo pacman -Syu tcpdump

possiamo correre tcpdump durante 10 secondi con le tue opzioni predefinite e reindirizza il tuo output a un file chiamato capture.txt con il seguente comando:

tempo scaduto 10 sudo tcpdump > cattura.txt

(tcpdump ha le sue opzioni per salvare il traffico di rete catturato in un file. Questo è un trucco veloce perché stiamo discutendo timeout, no tcpdump.)

tcpdump inizia a catturare il traffico di rete e aspettiamo 10 secondi. E 10 i secondi vanno e vengono e tcpdump è ancora in esecuzione e cattura.txt sta ancora crescendo di dimensioni. Sarà necessario un Ctrl + Ho fretta di smettere tcpdump.

Controllo della dimensione di capture.txt con ls mostra che è cresciuto fino a 209K in pochi secondi. Quel file stava crescendo rapidamente!

ls -lh cattura.txt

Cosa è successo? Perchè no timeout fermare tcpdump?

Tutto ha a che fare con i segni.

Invia il segnale corretto

quando timeout vuole fermare un programma, invia il Segnale SIGTERM. Questo chiede educatamente allo spettacolo di finire. Alcuni programmi possono scegliere di ignorare il segnale SIGTERM.. Quando ciò accade, dobbiamo dire timeout essere un po' più energico.

Possiamo farlo chiedendo timeout per inviare invece il segnale SIGKILL.

Il segnale SIGKILL non può essere “catturato”, bloccato o ignorato", succede sempre. SIGKILL non chiede educatamente al programma di fermarsi. SIGKILL si nasconde dietro l'angolo con un cronometro e un cosh.

Possiamo usare il -s (cartello) possibilità di contare timeout per inviare il segnale SIGKILL.

timeout -s SIGKILL 10 sudo tcpdump > cattura.txt

Questa volta, non appena sono scaduti 10 secondi, tcpdump è fermato.

Chiedi gentilmente prima

possiamo chiedere timeout per provare a fermare il programma usando SIGTERM, e invia solo SIGKILL se SIGTERM non ha funzionato.

Per fare questo, noi usiamo il -k (uccidi dopo) opzione. il -k L'opzione richiede un valore temporale come parametro.

In questo comando, stiamo chiedendo timeout permettere dmesg correre per 30 secondi e poi terminarlo con il segnale SIGTERM. e dmesg funziona ancora dopo 40 secondi, significa che il SIGTERM diplomatico è stato ignorato e timeout devi inviare SIGKILL per finire il lavoro.

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

timeout -k 40 30 dmseg -w

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

Sappiamo che non è stato SIGKILL a fermarsi dmesg perché SIGKILL lascia sempre un necrologio di una parola nella finestra del terminale: “Assassinato”. Ciò non è accaduto in questa circostanza.

Recupera il codice di uscita del programma

I programmi ben educati restituiscono un valore alla shell quando finiscono. Questo è noto come codice di uscita.. Generalmente, questo è usato per dire alla shell, o qualsiasi procedura avviata dal programma, se il programma ha riscontrato problemi durante l'esecuzione.

timeout fornire il proprio codice di uscita, ma è possibile che a noi non importi. Probabilmente siamo più interessati al codice di uscita della procedura che timeout sta controllando.

Questo comando abilita ping corri per cinque secondi. Stai eseguendo il ping di un computer chiamato Nostromo, che è sul testnet che è stato utilizzato per ricercare questo post.

tempo scaduto 5 ping Nostromo.local

Il comando viene eseguito per cinque secondi e timeout finiscilo. Quindi possiamo controllare il codice di uscita usando questo comando:

eco $?

Il codice di uscita è 124. Questo è il valore timeout utilizzato 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 di timeout è zero.

tempo scaduto 5 ping Nostromo.local
eco $?

Se l'esecuzione del programma termina prima timeout finiscilo, timeout puoi passare il codice di uscita del programma alla shell.

Perché questo accada, il programma dovrebbe fermarsi da solo (In altre parole, è no finito da timeout), e dobbiamo usare il --preserve-status opzione.

Se usiamo il -c (contare) opzione con un valore di cinque ping attiverà solo cinque richieste. Se diamo timeout un'estensione di un minuto, ping finirà sicuramente da solo. Quindi possiamo controllare il valore di output usando echo.

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

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, facciamo forza ping per generare un codice di uscita diverso. Se proviamo a inviare richieste di ping a un indirizzo IP inesistente, ping fallirà con un codice di uscita di errore. Allora possiamo usare echo per verificare che il codice di uscita sia diverso da zero.

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

il ping evidentemente, il comando non può raggiungere un dispositivo inesistente, quindi segnala l'errore e si chiude. Il codice di uscita è due. Questo è il codice di uscita ping utilizza per errori generali.

Determinare le regole di base

timeout si tratta di fornire alcuni limiti all'esecuzione dei programmi. Se esiste il pericolo che i file di registro invadano il disco rigido o dimentichino di aver lasciato in esecuzione uno strumento di rete, avvolgerli in timeout e lascia che il tuo computer si regoli da solo.

Iscriviti alla nostra Newsletter

Non ti invieremo posta SPAM. Lo odiamo quanto te.