Concordare, abbastanza tempo al computer. Puoi dare ai processi limiti di tempo, stabilendo un tempo massimo eseguibile con il timeout
comando. 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.
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”. Questo non è successo per questo caso.
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.