Az időtúllépési parancs használata Linuxon

Rendben, ez elég számítógépes idő. Időkorlátokat adhat a folyamatoknak, beállítva a maximális futamidőt az időtúllépési paranccsal. Íme egy oktatóanyag a programok futtatásának ezzel a paranccsal történő korlátozásához.

Mit jelent az időkorlát?

Az időtúllépés parancs lehetővé teszi korlátozza az időtartamot egy program fog futni. De miért akarod ezt megtenni?

Az egyik eset az, amikor pontosan tudja, mennyi ideig akar futni egy folyamatot. Gyakori felhasználási eset az, hogy időtúllépéssel vezérel egy naplózó vagy adatrögzítő programot, hogy a naplófájlok ne zabálják fel könyörtelenül a merevlemez-területet.

Egy másik eset az, amikor nem tudja, mennyi ideig akar futni egy folyamatot, de tudja, hogy nem akarja, hogy a végtelenségig fusson. Előfordulhat, hogy megszokta, hogy folyamatokat állítson be, minimalizálja a terminálablakot, és elfelejtse őket.

Egyes programok – még az egyszerű segédprogramok is – olyan szintű hálózati forgalmat generálhatnak, amely akadályozhatja a hálózat teljesítményét. Vagy leköthetik az erőforrásokat egy céleszközön, lelassítva annak teljesítményét. (ping, rád nézek.) Rossz gyakorlat, ha az ilyen típusú programokat huzamosabb ideig futni hagyod, amíg távol vagy a számítógépedtől.

időtúllépés része a GNU Core Utils így a Linux és a Unix-szerű operációs rendszerek, mint például a macOS, mind rendelkezik beépített időtúllépéssel. Nincs mit telepíteni; a dobozból azonnal használhatod.

Első lépések az időtúllépéssel

Íme egy egyszerű példa. Például az alapértelmezett parancssori beállításokkal a ping parancs addig fut, amíg le nem állítja a Ctrl+C lenyomásával. Ha nem szakítja félbe, akkor megy tovább.

ping 192.168.4.28

Az időtúllépés használatával megbizonyosodhatunk arról, hogy a ping ne futhasson tovább, és ne fusson tovább, elrágja a hálózati sávszélességet, és megzavarja a pingelés alatt álló eszközt.

  Az értesítési központ megtekintése iPhone és iPad készüléken

Ez a következő parancs időtúllépést használ a ping időkorlátozására. 15 másodperces futási időt engedélyezünk a ping számára.

timeout 15 ping 192.168.4.28

15 másodperc elteltével az időtúllépés leállítja a ping munkamenetet, és visszatérünk a parancssori prompthoz.

Időtúllépés használata más időegységekkel

Vegye figyelembe, hogy nem kellett „s”-t adnunk a 15. időtúllépés mögé, feltételezve, hogy az érték másodpercben van megadva. Hozzáadhat egy „s”-t, de ez valójában nem számít.

A percekben, órákban vagy napokban mért időérték használatához adjon hozzá „m”, „h” vagy „d” betűt.

A ping három percig tartó futtatásához használja a következő parancsot:

timeout 3m ping 192.168.4.28

A ping három percig fut, mielőtt az időtúllépés beáll, és leállítja a ping munkamenetet.

Adatrögzítés korlátozása időtúllépéssel

Egyes adatrögzítő fájlok nagyon gyorsan nagyra nőhetnek. Az ilyen fájlok nehézkessé vagy akár problémás méretének megelőzése érdekében korlátozza a rögzítőprogram futásának időtartamát.

Ebben a példában a tcpdump, a hálózati forgalom rögzítése eszköz. Azokon a tesztgépeken, amelyeken ezt a cikket tanulmányozták, a tcpdump már telepítve volt az Ubuntu Linuxon és a Fedora Linuxon. Telepíteni kellett Manjaro Linuxra és Arch Linuxra, a következő paranccsal:

sudo pacman -Syu tcpdump

Futtathatjuk a tcpdump-ot 10 másodpercig az alapértelmezett beállításokkal, és a kimenetét átirányíthatjuk a capture.txt fájlba a következő paranccsal:

timeout 10 sudo tcpdump > capture.txt

timeout 10 sudo tcpdump > capture.txt terminálablakban” width=”646″ height=”77″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>(A tcpdumpnak saját lehetőségei vannak a rögzített hálózati forgalom fájlba mentésére. Ez egy gyors feltörés, mert az időtúllépésről beszélünk, nem a tcpdumpról.)</p>
<p>A tcpdump elkezdi rögzíteni a hálózati forgalmat, és várunk 10 másodpercet.  És 10 másodperc jön és elmúlik, és a tcpdump még mindig fut, és a capture.txt mérete még mindig nő.  A tcpdump leállításához egy sietve Ctrl+C kell.</p>
<p>A capture.txt méretének ls-sel történő ellenőrzése azt mutatja, hogy pillanatok alatt 209K-ra nőtt.  Ez a fájl gyorsan növekedett!</p>
<pre>ls -lh capture.txt</pre>
<p><img loading=

Mi történt? Miért nem állította le az időtúllépés a tcpdump-ot?

Mindez a jelekkel kapcsolatos.

A megfelelő jel küldése

Amikor az időtúllépés le akar állítani egy programot, elküldi a SIGTERM jel. Ez udvariasan megkéri a program leállítását. Egyes programok figyelmen kívül hagyhatják a SIGTERM jelet. Amikor ez megtörténik, meg kell mondanunk az időtúllépést, hogy egy kicsit erőteljesebben legyünk.

  Gesztus alapú számológép alkalmazás, amely eredményeket takarít meg [Paid]

Ezt úgy tehetjük meg, hogy időtúllépést kérünk a SIGKILL jel küldésére.

A SIGKILL jelet nem lehet „elkapni, blokkolni vagy figyelmen kívül hagyni” – mindig átjön. SIGKILL nem kéri udvariasan a program leállítását. SIGKILL elbújik a sarkon egy stopperórával és egy cosh-val.

Használhatjuk a -s (signal) opciót, hogy jelezzük az időtúllépést a SIGKILL jel elküldéséhez.

timeout -s SIGKILL 10 sudo tcpdump > capture.txt

timeout -s SIGKILL 10 sudo tcpdump > capture.txt terminálablakban” width=”646″ height=”167″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>Ezúttal, amint 10 másodperc eltelik, a tcpdump leáll.</p>
<p>< img src=

Először udvariasan kérdezz

Kérhetünk időtúllépést, hogy megpróbáljuk leállítani a programot a SIGTERM használatával, és csak akkor küldjük be a SIGKILL-t, ha a SIGTERM nem működött.

Ehhez a -k (kill after) opciót használjuk. A -k opció paraméterként időértéket igényel.

Ebben a parancsban időtúllépést kérünk, hogy hagyja futni a dmesg-t 30 másodpercig, majd fejezze be a SIGTERM jellel. Ha a dmesg 40 másodperc után is fut, az azt jelenti, hogy a diplomáciai SIGTERM-et figyelmen kívül hagyták, és az időtúllépésnek SIGKILL-t kell küldenie a feladat befejezéséhez.

A dmesg egy olyan segédprogram, amely képes figyeli a kernelgyűrű puffer üzeneteit és megjeleníti őket egy terminál ablakban.

timeout -k 40 30 dmseg -w

A dmesg 30 másodpercig fut, és leáll, amikor megkapja a SIGTERM jelet.

Tudjuk, hogy nem a SIGKILL állította le a dmesg-t, mert a SIGKILL mindig egy egyszavas gyászjelentést hagy a terminál ablakában: „Killed”. Ebben az esetben ez nem történt meg.

A program kilépési kódjának lekérése

A jól működő programok leálláskor visszaadnak egy értéket a shellnek. Ezt kilépési kódnak nevezik. Általában ezt arra használják, hogy közöljék a héjjal – vagy bármilyen folyamattal, amely elindította a programot –, hogy a program nem találkozott-e problémákkal futás közben.

  Mi az átlagos Wi-Fi hálózat hatótávolsága?

Az időtúllépés saját kilépési kódot biztosít, de lehet, hogy ez minket nem érdekel. Valószínűleg jobban érdekel minket az időkorlát által vezérelt folyamat kilépési kódja.

Ez a parancs öt másodpercig engedélyezi a ping futtatását. Egy Nostromo nevű számítógépet pingel, amely azon a teszthálózaton van, amelyet a cikk kutatásához használtak.

timeout 5 ping Nostromo.local

A parancs öt másodpercig fut, és az időtúllépés leállítja. Ezután ellenőrizhetjük a kilépési kódot ezzel a paranccsal:

echo $?

A kilépési kód 124. Ezt az időtúllépési értéket használja a program SIGTERM használatával történő leállítására. Ha a SIGKILL leállítja a programot, a kilépési kód 137.

Ha megszakítjuk a programot a Ctrl+C billentyűkombinációval, akkor az időtúllépésből származó kilépési kód nulla.

timeout 5 ping Nostromo.local
echo $?

Ha a program végrehajtása az időkorlát befejezése előtt véget ér, az időtúllépés visszaadhatja a programból a kilépési kódot a shell-nek.

Ahhoz, hogy ez megtörténjen, a programnak magától le kell állnia (azaz nem szakítja meg időtúllépés), és a –preserve-status opciót kell használnunk.

Ha a -c (count) opciót használjuk öt értékkel, a ping csak öt kérést indít el. Ha az időtúllépésnek egy percet adunk, a ping biztosan magától leáll. Ezután az echo segítségével ellenőrizhetjük a kilépési értéket.

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

A ping befejezi az öt ping kérését, és leáll. A kilépési kód nulla.

Annak ellenőrzésére, hogy a kilépési kód pingből származik, kényszerítsük a ping-et egy másik kilépési kód generálására. Ha nem létező IP-címre próbálunk ping kérést küldeni, a ping hiba kilépési kóddal fog meghiúsulni. Ezután az echo segítségével ellenőrizhetjük, hogy a kilépési kód nem nulla.

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

A ping parancs nyilvánvalóan nem tudja elérni a nem létező eszközt, ezért jelzi a hibát és leáll. A kilépési kód kettő. Ezt a kilépési kódot használja a ping az általános hibákhoz.

Alapszabályok beállítása

Az időtúllépés lényege, hogy bizonyos határokat szabjon a futó programoknak. Ha fennáll a veszélye, hogy a naplófájlok túlterhelhetik a merevlemezt, vagy elfelejtheti, hogy futni hagyott egy hálózati eszközt, zárja le őket időtúllépéssel, és hagyja, hogy a számítógép önszabályozzon.