Sådan bruger du timeout-kommandoen på Linux

OK, det er nok computertid. Du kan give processer tidsbegrænsninger ved at indstille en maksimal tid, de kan køre i med timeoutkommandoen. Her er en tutorial til at sætte grænser for at køre programmer med denne kommando.

Hvad gør timeout for dig?

Timeout-kommandoen giver dig mulighed for sætte en grænse for varigheden et program vil køre for. Men hvorfor vil du gøre det?

Et tilfælde er, når du ved præcis, hvor længe du vil have en proces til at køre. En almindelig brugssag er at have timeout til at styre et log- eller datafangstprogram, så logfilerne ikke ubønhørligt fortærer din harddiskplads.

Et andet tilfælde er, når du ikke ved, hvor længe du vil have en proces til at køre i, men du ved, at du ikke vil have den til at køre på ubestemt tid. Du har måske en vane med at indstille processer til at køre, minimere terminalvinduet og glemme dem.

Nogle programmer – selv simple hjælpeprogrammer – kan generere netværkstrafik på niveauer, der kan hæmme dit netværks ydeevne. Eller de kan binde ressourcerne på en målenhed, hvilket bremser dens ydeevne. (ping, jeg kigger på dig.) At lade disse typer programmer køre i længere perioder, mens du er væk fra din computer, er dårlig praksis.

timeout er en del af GNU Core Utils så Linux og Unix-lignende operativsystemer såsom macOS har alle timeout indbygget. Der er ikke noget at installere; du kan bruge det lige ud af æsken.

Kom godt i gang med timeout

Her er et simpelt eksempel. For eksempel, med dens standard kommandolinjeindstillinger, vil ping-kommandoen køre, indtil du stopper den ved at trykke på Ctrl+C. Hvis du ikke afbryder det, fortsætter det bare.

ping 192.168.4.28

Ved at bruge timeout kan vi sikre, at ping ikke kører ved og ved, tygge netværksbåndbredden op og plage den enhed, der bliver pinget.

  Sådan monteres eksterne harddiske i Linux

Denne næste kommando bruger timeout til at tidsbegrænse ping. Vi tillader 15 sekunders køretid for ping.

timeout 15 ping 192.168.4.28

Efter 15 sekunders timeout afslutter ping-sessionen, og vi vender tilbage til kommandolinjeprompten.

Brug af timeout med andre tidsenheder

Bemærk, at vi ikke behøvede at tilføje et “s” bag 15. timeout antager, at værdien er i sekunder. Du kan tilføje et “s”, men det gør virkelig ingen forskel.

For at bruge en tidsværdi målt i minutter, timer eller dage skal du tilføje et “m”, et “h” eller et “d”.

For at få ping til at køre i tre minutter, brug følgende kommando:

timeout 3m ping 192.168.4.28

ping vil køre i tre minutter, før timeout træder ind og stopper ping-sessionen.

Begrænsning af datafangst med timeout

Nogle datafangstfiler kan vokse sig store meget hurtigt. For at forhindre, at sådanne filer bliver uhåndterlige eller endda problematiske i størrelse, skal du begrænse mængden af ​​tid, som optagelsesprogrammet må køre.

I dette eksempel bruger vi tcpdump, en indfangning af netværkstrafik værktøj. På testmaskinerne, som denne artikel blev undersøgt på, var tcpdump allerede installeret i Ubuntu Linux og Fedora Linux. Det skulle installeres på Manjaro Linux og Arch Linux med følgende kommando:

sudo pacman -Syu tcpdump

Vi kan køre tcpdump i 10 sekunder med dets standardindstillinger og omdirigere dets output til en fil kaldet capture.txt med følgende kommando:

timeout 10 sudo tcpdump > capture.txt

timeout 10 sudo tcpdump > capture.txt i et terminalvindue” width=”646″ height=”77″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>(tcpdump har sine egne muligheder for at gemme opfanget netværkstrafik til en fil. Dette er et hurtigt hack, fordi vi’ diskuterer timeout, ikke tcpdump.)</p>
<p>tcpdump begynder at fange netværkstrafik, og vi venter i 10 sekunder.  Og 10 sekunder kommer og går, og tcpdump kører stadig, og capture.txt vokser stadig i størrelse.  Det kommer til at tage en forhastet Ctrl+C for at stoppe tcpdump.</p>
<p>At kontrollere størrelsen af ​​capture.txt med ls viser, at den voksede til 209K i løbet af få sekunder.  Den fil voksede hurtigt!</p>
<pre>ls -lh capture.txt</pre>
<p><img loading=

Hvad skete der? Hvorfor stoppede timeout ikke tcpdump?

  Sådan installeres Libre Office på Linux

Det hele har med signaler at gøre.

Sender det rigtige signal

Når timeout ønsker at stoppe et program, sender den SIGTERM signal. Dette beder høfligt programmet om at afslutte. Nogle programmer kan vælge at ignorere SIGTERM-signalet. Når det sker, er vi nødt til at fortælle timeout for at være lidt mere kraftfuld.

Det kan vi gøre ved at bede timeout for at sende SIGKILL-signalet i stedet for.

SIGKILL-signalet kan ikke “fanges, blokeres eller ignoreres” – det kommer altid igennem. SIGKILL beder ikke høfligt programmet om at stoppe. SIGKILL gemmer sig rundt om hjørnet med et stopur og en cosh.

Vi kan bruge muligheden -s (signal) til at fortælle timeout for at sende SIGKILL-signalet.

timeout -s SIGKILL 10 sudo tcpdump > capture.txt

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

Spørger høfligt først

Vi kan bede om timeout for at prøve at stoppe programmet ved hjælp af SIGTERM, og kun at sende SIGKILL ind, hvis SIGTERM ikke virkede.

For at gøre dette bruger vi muligheden -k (dræb efter). Valgmuligheden -k kræver en tidsværdi som parameter.

I denne kommando beder vi timeout om at lade dmesg køre i 30 sekunder og derefter afslutte det med SIGTERM-signalet. Hvis dmesg stadig kører efter 40 sekunder, betyder det, at den diplomatiske SIGTERM blev ignoreret, og timeout skulle sende SIGKILL for at afslutte jobbet.

dmesg er et hjælpeprogram, der kan overvåge kernel ring buffer beskeder og vis dem i et terminalvindue.

timeout -k 40 30 dmseg -w

dmesg kører i 30 sekunder og stopper, når den modtager SIGTERM-signalet.

Vi ved, at det ikke var SIGKILL, der stoppede dmesg, fordi SIGKILL altid efterlader en nekrolog på ét ord i terminalvinduet: “Dræbt.” Det skete ikke i dette tilfælde.

Hentning af programmets afslutningskode

Velopdragne programmer sender en værdi tilbage til skallen, når de afsluttes. Dette er kendt som en udgangskode. Typisk bruges dette til at fortælle skallen – eller hvilken proces der nu startede programmet – om der opstod problemer med programmet, mens det kørte.

  Sådan spiller du Gunfire Reborn på Linux

timeout giver sin egen udgangskode, men det er vi måske ligeglade med. Vi er nok mere interesserede i exitkoden fra den proces, som timeout styrer.

Denne kommando lader ping køre i fem sekunder. Det pinger en computer kaldet Nostromo, som er på testnetværket, der blev brugt til at undersøge denne artikel.

timeout 5 ping Nostromo.local

Kommandoen kører i fem sekunder og timeout afslutter den. Vi kan derefter kontrollere udgangskoden ved hjælp af denne kommando:

echo $?

Afslutningskoden er 124. Dette er den værdi, timeout bruger til at angive, at programmet blev afsluttet ved hjælp af SIGTERM. Hvis SIGKILL afslutter programmet, er udgangskoden 137.

Hvis vi afbryder programmet med Ctrl+C, er udgangskoden fra timeout nul.

timeout 5 ping Nostromo.local
echo $?

Hvis afviklingen af ​​programmet slutter før timeout afslutter det, kan timeout sende exitkoden fra programmet tilbage til shellen.

For at dette kan ske, skal programmet stoppe af sig selv (med andre ord afsluttes det ikke ved timeout), og vi skal bruge –bevar-status-muligheden.

Hvis vi bruger muligheden -c (tæl) med en værdi på fem vil ping kun udløse fem anmodninger. Hvis vi giver timeout en varighed på et minut, vil ping helt sikkert være afsluttet af sig selv. Vi kan derefter kontrollere udgangsværdien ved hjælp af ekko.

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

ping fuldfører sine fem ping-anmodninger og afsluttes. Udgangskoden er nul.

For at bekræfte, at exit-koden kommer fra ping, lad os tvinge ping til at generere en anden exit-kode. Hvis vi forsøger at sende ping-anmodninger til en ikke-eksisterende IP-adresse, vil ping mislykkes med en fejlafslutningskode. Vi kan derefter bruge ekko til at kontrollere, at udgangskoden ikke er nul.

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

Ping-kommandoen kan åbenbart ikke nå den ikke-eksisterende enhed, så den rapporterer fejlen og lukker ned. Udgangskoden er to. Dette er den exit-kode, ping bruger til generelle fejl.

Indstilling af grundregler

timeout handler om at give nogle grænser til kørende programmer. Hvis der er en fare, kan logfilerne overskride din harddisk, eller at du måske glemmer, at du har ladet et netværksværktøj køre, så pak dem ind i timeout og lad din computer selvregulere.