Cum să utilizați comanda timeout pe Linux

OK, este suficient timp de calculator. Puteți da proceselor limite de timp, setând un timp maxim pentru care pot rula cu comanda timeout. Iată un tutorial pentru a pune limite la rularea programelor cu această comandă.

Ce face timeout pentru tine?

Comanda timeout vă permite stabiliți o limită a duratei de timp va rula un program pentru. Dar de ce ai vrea să faci asta?

Un caz este când știți exact cât timp doriți să ruleze un proces. Un caz obișnuit de utilizare este acela de a avea controlul timpului de expirare a unui program de înregistrare sau de captare a datelor, astfel încât fișierele de jurnal să nu devore neîncetat spațiul pe hard disk.

Un alt caz este atunci când nu știi cât timp vrei să ruleze un proces, dar știi că nu vrei să ruleze la infinit. S-ar putea să aveți obiceiul de a seta procesele care rulează, de a minimiza fereastra terminalului și de a uita de ele.

Unele programe – chiar și simple utilitare – pot genera trafic de rețea la niveluri care pot împiedica performanța rețelei dumneavoastră. Sau pot lega resursele de pe un dispozitiv țintă, încetinind performanța acestuia. (ping, mă uit la tine.) Lăsarea acestor tipuri de programe în funcțiune pentru perioade lungi de timp în timp ce sunteți departe de computer este o practică proastă.

timeout face parte din GNU Core Utils astfel încât sistemele de operare Linux și Unix, cum ar fi macOS, au toate timeout integrate. Nu este nimic de instalat; îl poți folosi imediat din cutie.

Noțiuni introductive cu timeout

Iată un exemplu simplu. De exemplu, cu opțiunile implicite de linie de comandă, comanda ping va rula până când o opriți apăsând Ctrl+C. Dacă nu îl întrerupi, va continua.

ping 192.168.4.28

Folosind timeout, ne putem asigura că ping-ul nu rulează la nesfârșit, explodând lățimea de bandă a rețelei și supărând orice dispozitiv este supus ping-ului.

Această următoare comandă folosește timeout pentru a limita ping-ul. Permitem 15 secunde de rulare pentru ping.

timeout 15 ping 192.168.4.28

După 15 secunde timeout se încheie sesiunea ping și suntem înapoiați la promptul liniei de comandă.

Utilizarea timeout cu alte unități de timp

Rețineți că nu a trebuit să adăugăm un „s” în spatele 15. timeout presupune că valoarea este în secunde. Ai putea adăuga un „s”, dar chiar nu are nicio diferență.

Pentru a utiliza o valoare a timpului măsurată în minute, ore sau zile, adăugați un „m”, un „h” sau un „d”.

Pentru a rula ping timp de trei minute, utilizați următoarea comandă:

timeout 3m ping 192.168.4.28

ping va rula timp de trei minute înainte ca timeout să intre și să oprească sesiunea de ping.

Limitarea captării datelor cu timeout

Unele fișiere de captură de date pot crește foarte repede. Pentru a preveni ca astfel de fișiere să devină greoaie sau chiar problematice ca dimensiune, limitați perioada de timp permisă programului de captare să ruleze.

În acest exemplu, folosim tcpdump, a captarea traficului de rețea instrument. Pe mașinile de testare pe care a fost cercetat acest articol, tcpdump era deja instalat în Ubuntu Linux și Fedora Linux. Trebuia instalat pe Manjaro Linux și Arch Linux, cu următoarea comandă:

sudo pacman -Syu tcpdump

Putem rula tcpdump timp de 10 secunde cu opțiunile sale implicite și redirecționăm rezultatul către un fișier numit capture.txt cu următoarea comandă:

timeout 10 sudo tcpdump > capture.txt

timeout 10 sudo tcpdump > capture.txt într-o fereastră de terminal” width=”646″ height=”77″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>(tcpdump are propriile opțiuni pentru a salva traficul de rețea capturat într-un fișier. Acesta este un hack rapid, deoarece noi” discutăm despre timeout, nu despre tcpdump.)</p>
<p>tcpdump începe să capteze traficul de rețea și așteptăm 10 secunde.  Și 10 secunde vin și pleacă și tcpdump încă rulează, iar capture.txt este încă în creștere.  Va fi nevoie de un Ctrl+C grăbit pentru a opri tcpdump.</p>
<p>Verificarea dimensiunii capture.txt cu ls arată că a crescut la 209K în câteva secunde.  Acel fișier creștea rapid!</p>
<pre>ls -lh capture.txt</pre>
<p><img loading=

Ce s-a întâmplat? De ce timeout nu a oprit tcpdump?

Totul ține de semnale.

Trimiterea semnalului corect

Când timeout dorește să oprească un program, acesta trimite semnal SIGTERM. Acest lucru cere politicos programului să se termine. Unele programe pot alege să ignore semnalul SIGTERM. Când se întâmplă asta, trebuie să spunem ca timeout să fie puțin mai puternic.

Putem face asta cerând timeout pentru a trimite semnalul SIGKILL în schimb.

Semnalul SIGKILL nu poate fi „prins, blocat sau ignorat” – acesta trece întotdeauna. SIGKILL nu cere politicos programul să se oprească. SIGKILL se ascunde după colț cu un cronometru și un coș.

Putem folosi opțiunea -s (semnal) pentru a spune timeout să trimită semnalul SIGKILL.

timeout -s SIGKILL 10 sudo tcpdump > capture.txt

timeout -s SIGKILL 10 sudo tcpdump > capture.txt într-o fereastră de terminal” width=”646″ height=”167″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>De data aceasta, de îndată ce au trecut 10 secunde, tcpdump este oprit.</p>
<p>< img src=

Întrebând politicos mai întâi

Putem cere timeout pentru a încerca să opriți programul folosind SIGTERM și să trimitem SIGKILL numai dacă SIGTERM nu a funcționat.

Pentru a face acest lucru, folosim opțiunea -k (ucide după). Opțiunea -k necesită o valoare de timp ca parametru.

În această comandă, solicităm expirarea timpului pentru a lăsa dmesg să ruleze timp de 30 de secunde și apoi să îl încheiem cu semnalul SIGTERM. Dacă dmesg încă rulează după 40 de secunde, înseamnă că SIGTERM diplomatic a fost ignorat și timeout ar trebui să trimită SIGKILL pentru a finaliza lucrarea.

dmesg este un utilitar care poate monitorizați mesajele bufferului inelului kernelului și afișați-le într-o fereastră de terminal.

timeout -k 40 30 dmseg -w

dmesg rulează timp de 30 de secunde și se oprește când primește semnalul SIGTERM.

Știm că nu SIGKILL a oprit dmesg-ul, deoarece SIGKILL lasă întotdeauna un necrolog cu un singur cuvânt în fereastra terminalului: „Ucis”. Asta nu s-a întâmplat în acest caz.

Preluarea codului de ieșire al programului

Programele bine comportate transmit o valoare înapoi shell-ului când se termină. Acesta este cunoscut ca un cod de ieșire. De obicei, aceasta este folosită pentru a spune shell-ului – sau oricare ar fi procesul care a lansat programul – dacă programul a întâmpinat probleme în timpul rulării.

timeout oferă propriul cod de ieșire, dar s-ar putea să nu ne pese de asta. Probabil că suntem mai interesați de codul de ieșire din procesul pe care timeout-ul îl controlează.

Această comandă lasă ping să ruleze timp de cinci secunde. Face ping unui computer numit Nostromo, care se află în rețeaua de testare care a fost folosită pentru a cerceta acest articol.

timeout 5 ping Nostromo.local

Comanda rulează timp de cinci secunde și timeout-ul o termină. Apoi putem verifica codul de ieșire folosind această comandă:

echo $?

Codul de ieșire este 124. Aceasta este valoarea folosită de timeout pentru a indica că programul a fost încheiat utilizând SIGTERM. Dacă SIGKILL încheie programul, codul de ieșire este 137.

Dacă întrerupem programul cu Ctrl+C, codul de ieșire din timeout este zero.

timeout 5 ping Nostromo.local
echo $?

Dacă execuția programului se termină înainte ca timeout-ul să-l încheie, timeout-ul poate transmite codul de ieșire din program înapoi în shell.

Pentru ca acest lucru să se întâmple, programul trebuie să se oprească de la sine (cu alte cuvinte, nu este încheiat de timeout) și trebuie să folosim opțiunea –preserve-status.

Dacă folosim opțiunea -c (count) cu o valoare de cinci ping, va declanșa doar cinci solicitări. Dacă acordăm timeout o durată de un minut, ping-ul se va fi încheiat cu siguranță de la sine. Apoi putem verifica valoarea de ieșire folosind echo.

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

ping își finalizează cele cinci solicitări ping și se încheie. Codul de ieșire este zero.

Pentru a verifica codul de ieșire provine din ping, să forțăm ping să genereze un alt cod de ieșire. Dacă încercăm să trimitem solicitări ping la o adresă IP inexistentă, ping-ul va eșua cu un cod de ieșire de eroare. Apoi putem folosi echo pentru a verifica dacă codul de ieșire este diferit de zero.

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

Comanda ping evident nu poate ajunge la dispozitivul inexistent, așa că raportează eroarea și se închide. Codul de ieșire este doi. Acesta este codul de ieșire folosit de ping pentru erori generale.

Stabilirea regulilor de bază

timeout se referă la furnizarea unor limite pentru rularea programelor. Dacă există pericolul ca fișierele jurnal să vă depășească hard disk-ul sau să uitați că ați lăsat în funcțiune un instrument de rețea, includeți-le în timeout și lăsați computerul să se auto-regleze.