
OK, dat is genoeg computertijd. U kunt processen tijdslimieten geven door een maximale tijd in te stellen waarvoor ze kunnen draaien met de timeoutopdracht. Hier is een tutorial om grenzen te stellen aan het uitvoeren van programma’s met deze opdracht.
Wat doet time-out voor jou?
De timeout commando stelt u in staat om een limiet in te stellen voor de tijdsduur dat een programma zal draaien. Maar waarom zou je dat willen doen?
Een geval is wanneer u precies weet hoelang u wilt dat een proces duurt. Een veel voorkomende use-case is om te hebben timeout beheer een programma voor logboekregistratie of gegevensregistratie, zodat de logbestanden niet meedogenloos de ruimte op uw harde schijf verslinden.
Een ander geval is wanneer u niet weet hoelang u een proces wilt laten lopen, maar u weet wel dat u niet wilt dat het voor onbepaalde tijd wordt uitgevoerd. U hebt misschien de gewoonte om processen in werking te stellen, het terminalvenster te minimaliseren en ze te vergeten.
Sommige programma’s, zelfs eenvoudige hulpprogramma’s, kunnen netwerkverkeer genereren op niveaus die de prestaties van uw netwerk kunnen belemmeren. Of ze kunnen de bronnen op een doelapparaat vastleggen, waardoor de prestaties worden vertraagd. (ping, Ik kijk naar jou.) Dit soort programma’s langere tijd laten draaien terwijl je niet achter je computer zit, is een slechte gewoonte.
timeout maakt deel uit van de GNU Core Utils, dus Linux en Unix-achtige besturingssystemen zoals macOS hebben allemaal een ingebouwde time-out. Er hoeft niets te installeren; u kunt het direct uit de doos gebruiken.
Aan de slag met time-out
Hier is een eenvoudig voorbeeld. Met de standaard opdrachtregelopties is de ping commando wordt uitgevoerd totdat je het stopt door op Ctrl + C te drukken. Als je het niet onderbreekt, gaat het gewoon door.
ping 192.168.4.28

Door het gebruiken van timeout, we kunnen ervoor zorgen ping draait niet steeds maar door, kauwt netwerkbandbreedte op en pingt het apparaat dat wordt gepingd.
Dit volgende commando gebruikt timeout tot tijdslimiet ping. We rekenen 15 seconden looptijd voor ping.
timeout 15 ping 192.168.4.28

Na 15 seconden timeout beëindigt de ping sessie en we keren terug naar de opdrachtregelprompt.

Time-out gebruiken met andere tijdseenheden
Merk op dat we geen “s” hoefden toe te voegen achter de 15. timeout veronderstelt dat de waarde in seconden is. Je zou een “s” kunnen toevoegen, maar het maakt echt niet uit.
Als u een tijdwaarde wilt gebruiken die wordt gemeten in minuten, uren of dagen, voegt u een ‘m’, een ‘h’ of een ‘d’ toe.
Gebruik de volgende opdracht om de ping drie minuten te laten draaien:
timeout 3m ping 192.168.4.28

ping loopt drie minuten eerder timeout stapt in en stopt het ping sessie.

Het vastleggen van gegevens beperken met een time-out
Sommige bestanden voor het vastleggen van gegevens kunnen zeer snel groot worden. Om te voorkomen dat dergelijke bestanden onpraktisch of zelfs problematisch van omvang worden, moet u de tijd dat het opnameprogramma mag worden uitgevoerd, beperken.
In dit voorbeeld gebruiken we tcpdump, een hulpmiddel voor het vastleggen van netwerkverkeer. Op de testmachines waarop dit artikel is onderzocht, tcpdump was al geïnstalleerd in Ubuntu Linux en Fedora Linux. Het moest worden geïnstalleerd op Manjaro Linux en Arch Linux, met het volgende commando:
sudo pacman -Syu tcpdump

We kunnen rennen tcpdump gedurende 10 seconden met de standaardopties en stuur de uitvoer door naar een bestand met de naam capture.txt met de volgende opdracht:
timeout 10 sudo tcpdump > capture.txt

Wat is er gebeurd? Waarom niet timeout hou op tcpdump?
Het heeft allemaal te maken met signalen.
Het juiste signaal verzenden
Wanneer timeout een programma wil stoppen zendt het het SIGTERM-signaal. Dit vraagt beleefd het programma te beëindigen. Sommige programma’s kunnen ervoor kiezen om het SIGTERM-signaal te negeren. Als dat gebeurt, moeten we het vertellen timeout om een beetje krachtiger te zijn.
Dat kunnen we doen door te vragen timeout om in plaats daarvan het SIGKILL-signaal te verzenden.
Het SIGKILL-signaal kan niet worden “opgevangen, geblokkeerd of genegeerd” – het komt altijd door. SIGKILL vraagt het programma niet beleefd om te stoppen. SIGKILL verstopt zich om de hoek met een stopwatch en een cosh.
We kunnen de -s (signaal) optie om te vertellen timeout om het SIGKILL-signaal te verzenden.
timeout -s SIGKILL 10 sudo tcpdump > capture.txt

Eerst beleefd vragen
We kunnen het vragen timeout om te proberen het programma te stoppen met SIGTERM, en om alleen SIGKILL in te sturen als SIGTERM niet werkte.
Hiervoor gebruiken we de -k (doden na) optie. De -k optie vereist een tijdwaarde als parameter.
In dit commando vragen we timeout te laten dmesg lopen gedurende 30 seconden, en om het dan te beëindigen met het SIGTERM-signaal. Als dmesg na 40 seconden nog steeds loopt, betekent dit dat de diplomatieke SIGTERM werd genegeerd en timeout moet SIGKILL sturen om de klus te klaren.
dmesg is een hulpprogramma dat de berichten van de kernelringbuffer kan controleren en deze in een terminalvenster kan weergeven.
timeout -k 40 30 dmseg -w

dmesg loopt 30 seconden en stopt wanneer het het SIGTERM-signaal ontvangt.

We weten dat het niet SIGKILL was die stopte dmesg omdat SIGKILL altijd een overlijdensbericht van één woord achterlaat in het terminalvenster: “Killed”. Dat is in dit geval niet gebeurd.
De afsluitcode van het programma ophalen
Goed opgevoede programma’s geven een waarde terug aan de shell wanneer ze worden beëindigd. Dit staat bekend als een exitcode. Meestal wordt dit gebruikt om de shell – of welk proces dan ook dat het programma heeft gestart – te vertellen of het programma problemen ondervond terwijl het werd uitgevoerd.
timeout geeft zijn eigen exitcode, maar dat interesseert ons misschien niet. We zijn waarschijnlijk meer geïnteresseerd in de exitcode van het proces dat timeout controleert.
Dit commando laat ping ren vijf seconden. Het pingt een computer genaamd Nostromo, die zich op het testnetwerk bevindt dat werd gebruikt om dit artikel te onderzoeken.
timeout 5 ping Nostromo.local

De opdracht wordt vijf seconden uitgevoerd en timeout beëindigt het. We kunnen dan de exitcode controleren met behulp van deze opdracht:
echo $?

De exitcode is 124. Dit is de waarde timeout gebruikt om aan te geven dat het programma is beëindigd met SIGTERM. Als SIGKILL het programma beëindigt, is de afsluitcode 137.
Als we het programma onderbreken met Ctrl + C de exitcode from timeout is nul.
timeout 5 ping Nostromo.local
echo $?

Als de uitvoering van het programma eindigt voordat timeout beëindigt het, timeout kan de exitcode van het programma teruggeven aan de shell.
Om dit te laten gebeuren, moet het programma vanzelf tot stilstand komen (met andere woorden: het is niet beëindigd door timeout), en we moeten de --preserve-status optie.
Als we de -c (tel) optie met een waarde van vijf ping zal slechts vijf verzoeken afvuren. Als we geven timeout een duur van één minuut, ping zal definitief vanzelf beëindigd zijn. We kunnen dan de exitwaarde controleren met echo.
timeout --preserve-status 1m ping -c 5 Nostromo.local
echo $?

ping voltooit zijn vijf ping-verzoeken en wordt beëindigd. De exitcode is nul.
Om te controleren of de exitcode afkomstig is van ping, laten we forceren ping om een andere exitcode te genereren. Als we pingverzoeken naar een niet-bestaand IP-adres proberen te sturen, ping zal mislukken met een fout exit-code. We kunnen dan gebruiken echo om te controleren of de afsluitcode niet nul is.
timeout --preserve-status 1m ping -c 5 NotHere.local
echo $?

De ping commando kan het niet-bestaande apparaat duidelijk niet bereiken, dus het rapporteert de fout en wordt afgesloten. De exitcode is twee. Dit is de exitcode ping gebruikt voor algemene fouten.
Basisregels opstellen
timeout gaat over het geven van grenzen aan actieve programma’s. Als er een gevaar bestaat dat de logbestanden uw harde schijf overschrijden of dat u vergeet dat u een netwerktool heeft laten draaien, wikkel ze dan in timeout en laat uw computer zichzelf reguleren.