Hvordan bruke timeout-kommandoen på Linux

OK, det er nok datamaskintid. Du kan gi prosesser tidsbegrensninger, og angi en maksimal tid de kan kjøre for med timeout-kommandoen. Her er en veiledning for å sette grenser for å kjøre programmer med denne kommandoen.

Hva gjør timeout for deg?

Timeout-kommandoen lar deg sette en grense for lengden på tiden et program vil kjøre for. Men hvorfor vil du gjøre det?

Et tilfelle er når du vet nøyaktig hvor lenge du vil at en prosess skal pågå. En vanlig brukssak er å ha tidsavbruddskontroll av et logg- eller datafangstprogram slik at loggfilene ikke nådeløst sluker harddiskplassen din.

Et annet tilfelle er når du ikke vet hvor lenge du vil at en prosess skal kjøre, men du vet at du ikke vil at den skal kjøre på ubestemt tid. Du har kanskje en vane med å sette prosesser i gang, minimere terminalvinduet og glemme dem.

Noen programmer – selv enkle verktøy – kan generere nettverkstrafikk på nivåer som kan hindre ytelsen til nettverket ditt. Eller de kan binde opp ressursene på en målenhet, og redusere ytelsen. (ping, jeg ser på deg.) Å la denne typen programmer kjøre i lengre perioder mens du er borte fra datamaskinen er dårlig praksis.

timeout er en del av GNU Core Utils så Linux og Unix-lignende operativsystemer som macOS har alle timeout innebygd. Det er ingenting å installere; du kan bruke den rett ut av esken.

Komme i gang Med timeout

Her er et enkelt eksempel. For eksempel, med standard kommandolinjealternativer, vil ping-kommandoen kjøre til du stopper den ved å trykke Ctrl+C. Hvis du ikke avbryter det, vil det bare fortsette.

ping 192.168.4.28

Ved å bruke tidsavbrudd kan vi sørge for at ping ikke kjører av og på, tygge opp nettverksbåndbredde og plage hvilken enhet som blir pinget.

  Hvordan spille Orwell på Linux

Denne neste kommandoen bruker timeout for å tidsbegrense ping. Vi tillater 15 sekunders kjøretid for ping.

timeout 15 ping 192.168.4.28

Etter 15 sekunders tidsavbrudd avslutter ping-økten og vi returneres til ledeteksten på kommandolinjen.

Bruke timeout med andre tidsenheter

Merk at vi ikke trengte å legge til en «s» bak 15. timeout antar at verdien er i sekunder. Du kan legge til en «s», men det spiller ingen rolle.

For å bruke en tidsverdi målt i minutter, timer eller dager, legg til en «m», en «h» eller en «d».

For å kjøre ping i tre minutter, bruk følgende kommando:

timeout 3m ping 192.168.4.28

ping vil kjøre i tre minutter før timeout trer inn og stopper ping-økten.

Begrenser datafangst med tidsavbrudd

Noen datafangstfiler kan vokse seg store veldig raskt. For å forhindre at slike filer blir uhåndterlige eller til og med problematiske i størrelse, må du begrense hvor lang tid fangstprogrammet får kjøre.

I dette eksemplet bruker vi tcpdump, en fangst av nettverkstrafikk verktøy. På testmaskinene som denne artikkelen ble undersøkt på, var tcpdump allerede installert i Ubuntu Linux og Fedora Linux. Det måtte installeres på Manjaro Linux og Arch Linux, med følgende kommando:

sudo pacman -Syu tcpdump

Vi kan kjøre tcpdump i 10 sekunder med standardalternativene, og omdirigere utdataene til en fil kalt capture.txt med følgende kommando:

timeout 10 sudo tcpdump > capture.txt

timeout 10 sudo tcpdump > capture.txt i et terminalvindu” width=”646″ height=”77″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>(tcpdump har sine egne alternativer for å lagre fanget nettverkstrafikk til en fil. Dette er et raskt hack fordi vi» diskuterer timeout, ikke tcpdump.)</p>
<p>tcpdump begynner å fange opp nettverkstrafikk og vi venter i 10 sekunder.  Og 10 sekunder kommer og går og tcpdump kjører fortsatt, og capture.txt vokser fortsatt i størrelse.  Det kommer til å ta en forhastet Ctrl+C for å stoppe tcpdump.</p>
<p>Å sjekke størrelsen på capture.txt med ls viser at den vokste til 209K i løpet av sekunder.  Den filen vokste raskt!</p>
<pre>ls -lh capture.txt</pre>
<p><img loading=

Hva skjedde? Hvorfor stoppet ikke timeout tcpdump?

  Hvordan installere Delft-ikontemaet i Linux

Alt har med signaler å gjøre.

Sender det riktige signalet

Når timeout ønsker å stoppe et program, sender den SIGTERM-signal. Dette ber høflig programmet om å avslutte. Noen programmer kan velge å ignorere SIGTERM-signalet. Når det skjer, må vi fortelle timeout å være litt mer kraftfull.

Vi kan gjøre det ved å spørre timeout for å sende SIGKILL-signalet i stedet.

SIGKILL-signalet kan ikke «fanges, blokkeres eller ignoreres» – det kommer alltid gjennom. SIGKILL ber ikke høflig om å stoppe programmet. SIGKILL gjemmer seg rundt hjørnet med en stoppeklokke og en cosh.

Vi kan bruke alternativet -s (signal) for å fortelle timeout for å sende SIGKILL-signalet.

timeout -s SIGKILL 10 sudo tcpdump > capture.txt

timeout -s SIGKILL 10 sudo tcpdump > capture.txt i et terminalvindu” width=”646″ height=”167″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>Denne gangen, så snart 10 sekunder har gått, stoppes tcpdump.</p>
<p>< img src=

Spør høflig først

Vi kan be om timeout for å prøve å stoppe programmet ved hjelp av SIGTERM, og kun sende inn SIGKILL hvis SIGTERM ikke fungerte.

For å gjøre dette bruker vi alternativet -k (kill after). Alternativet -k krever en tidsverdi som parameter.

I denne kommandoen ber vi timeout for å la dmesg kjøre i 30 sekunder, og deretter avslutte den med SIGTERM-signalet. Hvis dmesg fortsatt kjører etter 40 sekunder, betyr det at den diplomatiske SIGTERM ble ignorert og timeout skulle sende inn SIGKILL for å fullføre jobben.

dmesg er et verktøy som kan overvåke kjerneringbuffermeldingene og vis dem i et terminalvindu.

timeout -k 40 30 dmseg -w

dmesg kjører i 30 sekunder og stopper når den mottar SIGTERM-signalet.

Vi vet at det ikke var SIGKILL som stoppet dmesg fordi SIGKILL alltid legger igjen en nekrolog på ett ord i terminalvinduet: «Killed.» Det skjedde ikke i dette tilfellet.

Henter programmets utgangskode

Veloppdragne programmer sender en verdi tilbake til skallet når de avsluttes. Dette er kjent som en utgangskode. Vanligvis brukes dette til å fortelle skallet – eller hvilken som helst prosess som startet programmet – om det oppsto problemer med programmet mens det kjørte.

  Hvordan spille Galactic Civilizations III på Linux

timeout gir sin egen utgangskode, men vi bryr oss kanskje ikke om det. Vi er nok mer interessert i utgangskoden fra prosessen som timeout styrer.

Denne kommandoen lar ping kjøre i fem sekunder. Det pinger en datamaskin som heter Nostromo, som er på testnettverket som ble brukt til å undersøke denne artikkelen.

timeout 5 ping Nostromo.local

Kommandoen kjører i fem sekunder og timeout avslutter den. Vi kan deretter sjekke utgangskoden ved å bruke denne kommandoen:

echo $?

Utgangskoden er 124. Dette er verdien som timeout bruker for å indikere at programmet ble avsluttet med SIGTERM. Hvis SIGKILL avslutter programmet, er utgangskoden 137.

Hvis vi avbryter programmet med Ctrl+C, er utgangskoden fra timeout null.

timeout 5 ping Nostromo.local
echo $?

Hvis kjøringen av programmet avsluttes før timeout avslutter det, kan timeout sende utgangskoden fra programmet tilbake til skallet.

For at dette skal skje, må programmet stoppe av seg selv (med andre ord avsluttes det ikke med timeout), og vi må bruke alternativet –bevar-status.

Hvis vi bruker alternativet -c (telling) med en verdi på fem vil ping bare avfyre ​​fem forespørsler. Hvis vi gir timeout en varighet på ett minutt, vil ping definitivt ha avsluttet av seg selv. Vi kan deretter sjekke utgangsverdien ved å bruke ekko.

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

ping fullfører sine fem ping-forespørsler og avsluttes. Utgangskoden er null.

For å bekrefte at utgangskoden kommer fra ping, la oss tvinge ping til å generere en annen utgangskode. Hvis vi prøver å sende ping-forespørsler til en ikke-eksisterende IP-adresse, vil ping mislykkes med en utgangskode for feil. Vi kan da bruke ekko for å sjekke at utgangskoden ikke er null.

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

Ping-kommandoen kan åpenbart ikke nå den ikke-eksisterende enheten, så den rapporterer feilen og lukkes. Utgangskoden er to. Dette er utgangskoden ping bruker for generelle feil.

Sette grunnregler

Timeout handler om å gi noen grenser for kjørende programmer. Hvis det er fare for at loggfilene kan overkjøre harddisken din eller at du kanskje glemmer at du la et nettverksverktøy kjører, pakk dem inn i timeout og la datamaskinen din selvregulere.