Jak používat příkaz timeout v systému Linux

Dobře, to je dost času na počítači. Procesům můžete přidělit časové limity a nastavit maximální dobu, po kterou mohou běžet pomocí příkazu timeout. Zde je návod, jak omezit spouštění programů pomocí tohoto příkazu.

Co pro vás časový limit udělá?

Umožňuje vám to příkaz timeout stanovit časový limit poběží program. Ale proč byste to chtěli dělat?

Jedním z případů je situace, kdy přesně víte, jak dlouho chcete, aby proces běžel. Běžným případem použití je kontrola časového limitu programu pro protokolování nebo zachycování dat, aby soubory protokolu neúnavně nepožíraly místo na pevném disku.

Jiný případ je, když nevíte, jak dlouho chcete, aby proces běžel, ale víte, že nechcete, aby běžel donekonečna. Možná máte ve zvyku nastavit běh procesů, minimalizovat okno terminálu a zapomenout na ně.

Některé programy – dokonce i jednoduché nástroje – mohou generovat síťový provoz na úrovních, které mohou bránit výkonu vaší sítě. Nebo mohou svázat zdroje na cílovém zařízení a zpomalit jeho výkon. (ping, dívám se na vás.) Nechat tyto typy programů spuštěné delší dobu, když nejste u počítače, je špatný postup.

časový limit je součástí GNU Core Utils takže Linux a operační systémy podobné Unixu, jako je macOS, mají ve všech zabudovaný časový limit. Není co instalovat; můžete jej použít hned po vybalení z krabice.

Začínáme s časovým limitem

Zde je jednoduchý příklad. Například s výchozími možnostmi příkazového řádku bude příkaz ping běžet, dokud jej nezastavíte stisknutím Ctrl+C. Pokud to nepřerušíte, bude to pokračovat.

ping 192.168.4.28

Pomocí časového limitu můžeme zajistit, aby ping neběžel stále dokola, žvýkání šířky pásma sítě a otravování jakéhokoli zařízení, na které se pinguje.

  Jak používat příkaz look v systému Linux

Tento další příkaz používá časový limit k časovému omezení pingu. Povolujeme 15 sekund běhu pro ping.

timeout 15 ping 192.168.4.28

Po 15 sekundách timeout ukončí ping relace a vrátíme se do příkazového řádku.

Použití časového limitu s jinými časovými jednotkami

Všimněte si, že jsme nemuseli přidat „s“ za 15. časový limit předpokládá, že hodnota je v sekundách. Můžete přidat „s“, ale ve skutečnosti na tom nezáleží.

Chcete-li použít hodnotu času měřenou v minutách, hodinách nebo dnech, přidejte „m“, „h“ nebo „d“.

Chcete-li, aby ping běžel tři minuty, použijte následující příkaz:

timeout 3m ping 192.168.4.28

ping poběží tři minuty, než dojde k vypršení časového limitu a zastaví relaci ping.

Omezení sběru dat s časovým limitem

Některé soubory pro zachycení dat se mohou velmi rychle zvětšit. Chcete-li zabránit tomu, aby se takové soubory staly nepraktickými nebo dokonce problémovými ve velikosti, omezte dobu, po kterou může program pro zachycení běžet.

V tomto příkladu používáme tcpdump, a zachycení síťového provozu nástroj. Na testovacích počítačích, na kterých byl tento článek zkoumán, byl tcpdump již nainstalován v Ubuntu Linux a Fedora Linux. Musel být nainstalován na Manjaro Linux a Arch Linux s následujícím příkazem:

sudo pacman -Syu tcpdump

Můžeme spustit tcpdump po dobu 10 sekund s jeho výchozími možnostmi a přesměrovat jeho výstup do souboru s názvem capture.txt pomocí následujícího příkazu:

timeout 10 sudo tcpdump > capture.txt

časový limit 10 sudo tcpdump > capture.txt v okně terminálu” width=”646″ height=”77″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>(tcpdump má své vlastní možnosti, jak uložit zachycený síťový provoz do souboru. Toto je rychlý hack, protože znovu diskutujeme o časovém limitu, ne o tcpdump.)</p>
<p>tcpdump začne zachycovat síťový provoz a my čekáme 10 sekund.  A 10 sekund přichází a odchází a tcpdump stále běží a capture.txt stále roste.  Zastavení tcpdump bude vyžadovat zbrklé Ctrl+C.</p>
<p>Kontrola velikosti capture.txt pomocí ls ukazuje, že během několika sekund vzrostla na 209 kB.  Ten soubor se rychle rozrůstal!</p>
<pre>ls -lh capture.txt</pre>
<p><img loading=

Co se stalo? Proč časový limit nezastavil tcpdump?

  Jak přidat uživatele do souboru Sudoer v systému Linux

Všechno to souvisí se signály.

Vysílání správného signálu

Když timeout chce zastavit program, odešle signál SIGTERM. To zdvořile požádá program o ukončení. Některé programy se mohou rozhodnout signál SIGTERM ignorovat. Když se to stane, musíme říct timeout, abychom byli trochu důraznější.

Můžeme to udělat tak, že požádáme o časový limit pro odeslání signálu SIGKILL.

Signál SIGKILL nelze „chytit, zablokovat nebo ignorovat“ – vždy projde. SIGKILL zdvořile nepožádá o zastavení programu. SIGKILL se schovává za rohem se stopkami a košíčkem.

Můžeme použít volbu -s (signál) k určení časového limitu pro odeslání signálu SIGKILL.

timeout -s SIGKILL 10 sudo tcpdump > capture.txt

timeout -s SIGKILL 10 sudo tcpdump > capture.txt v okně terminálu” width=”646″ height=”167″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>Tentokrát, jakmile uplyne 10 sekund, se tcpdump zastaví.</p>
<p>< img src=

Nejprve se zdvořile zeptat

Můžeme požádat o časový limit, abychom se pokusili zastavit program pomocí SIGTERM a odeslat SIGKILL pouze v případě, že SIGTERM nefungoval.

K tomu použijeme volbu -k (kill after). Volba -k vyžaduje jako parametr hodnotu času.

V tomto příkazu požadujeme vypršení časového limitu, aby se dmesg nechal běžet 30 sekund a poté byl ukončen signálem SIGTERM. Pokud dmesg stále běží po 40 sekundách, znamená to, že diplomatický SIGTERM byl ignorován a časový limit by měl odeslat SIGKILL k dokončení úlohy.

dmesg je nástroj, který umí monitorovat zprávy kruhové vyrovnávací paměti jádra a zobrazit je v okně terminálu.

timeout -k 40 30 dmseg -w

dmesg běží 30 sekund a zastaví se, když přijme signál SIGTERM.

Víme, že to nebyl SIGKILL, kdo zastavil dmesg, protože SIGKILL vždy zanechá v okně terminálu jednoslovný nekrolog: „Killed“. To se v tomto případě nestalo.

Získání výstupního kódu programu

Dobře fungující programy předají hodnotu zpět do shellu, když se ukončí. Toto je známé jako výstupní kód. Obvykle se to používá k tomu, aby se shellu – nebo jakémukoli procesu spustilo program – sdělilo, zda program při běhu narazil na problémy.

  Jak získat přístup k Disku Google v systému Linux

timeout poskytuje svůj vlastní výstupní kód, ale to nás nemusí zajímat. Pravděpodobně nás více zajímá výstupní kód z procesu, který timeout řídí.

Tento příkaz nechá ping běžet po dobu pěti sekund. Pinguje počítač s názvem Nostromo, který je v testovací síti, která byla použita k výzkumu tohoto článku.

timeout 5 ping Nostromo.local

Příkaz běží po dobu pěti sekund a časový limit jej ukončí. Poté můžeme zkontrolovat výstupní kód pomocí tohoto příkazu:

echo $?

Ukončovací kód je 124. Toto je hodnota, kterou časový limit používá k označení programu, který byl ukončen pomocí SIGTERM. Pokud SIGKILL ukončí program, ukončovací kód je 137.

Pokud program přerušíme Ctrl+C, ukončovací kód z timeoutu je nulový.

timeout 5 ping Nostromo.local
echo $?

Pokud provádění programu skončí dříve, než jej ukončí časový limit, může časový limit předat výstupní kód z programu zpět do shellu.

Aby k tomu došlo, program se musí zastavit sám od sebe (jinými slovy, není ukončen timeoutem) a musíme použít volbu –preserve-status.

Pokud použijeme volbu -c (count) s hodnotou pět, spustí se pouze pět požadavků. Pokud dáme timeout dobu trvání jedné minuty, ping se definitivně ukončí sám. Hodnotu odchodu pak můžeme zkontrolovat pomocí echo.

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

ping dokončí svých pět požadavků ping a ukončí se. Výstupní kód je nula.

Chcete-li ověřit, že výstupní kód pochází z příkazu ping, vynuťme příkaz ping, aby vygeneroval jiný ukončovací kód. Pokud se pokusíme odeslat požadavky ping na neexistující IP adresu, ping selže s chybovým ukončovacím kódem. Poté můžeme pomocí echo zkontrolovat, zda je výstupní kód nenulový.

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

Příkaz ping zjevně nemůže dosáhnout neexistujícího zařízení, takže ohlásí chybu a zavře se. Výstupní kód je dva. Toto je výstupní kód, který ping používá pro obecné chyby.

Nastavení základních pravidel

časový limit je o poskytnutí určitých hranic spouštěným programům. Pokud existuje nebezpečí, že by soubory protokolu mohly přetížit váš pevný disk nebo že byste mohli zapomenout, že jste nechali spuštěný síťový nástroj, zabalte je do časového limitu a nechte počítač, aby se samoreguloval.