Příkaz timeout
je nástroj příkazového řádku, který provádí zadaný příkaz a zastaví jej, pokud je po určité době stále spuštěn. Jinými slovy, příkaz timeout
umožňuje spustit příkaz s časovým limitem, který určíte. Příkaz timeout
je součástí základního balíčku GNU utility, který je nainstalován na téměř všech distribucích Linuxu.
Tento příkaz je užitečný, když chcete spustit příkaz, který nemá vestavěnou možnost časového limitu, nebo chcete zastavit proces po určité době běhu.
V tomto článku si vysvětlíme, jak používat příkazy timeout
v terminálu Linux.
Jak používat příkaz Timeout
Syntaxe příkazu timeout je následující:
timeout [OPTIONS] DURATION COMMAND [ARG]…
DURATION
může být kladné celé číslo nebo číslo s plovoucí desetinnou čárkou následované volitelnou příponou jednotky:
s
– sekundy (sekundy) (toto je výchozí možnost)m
– minuty (minuty)h
– hodiny (hodiny)d
– dny (dny)
Pokud nejsou použity žádné jednotky, výchozí nastavení jsou sekundy. Pokud je doba trvání nastavena na nulu, související časový limit je deaktivován.
Před argumentem musí být uvedeny možnosti příkazu.
Zde je několik základních příkladů, jak používat příkaz timeout
:
- Zastavte příkaz
ping
po pěti sekundách::timeout 5 ping 8.8.8.8 - Zastavte příkaz po pěti minutách:timeout 5m ping 8.8.8.8
- Zastavte příkaz po jedné minutě a šesti sekundách:timeout 1,1 m ping 8.8.8.8
Pokud chcete spustit příkaz, který vyžaduje oprávnění jako tcpdump
, přidejte předponu sudo
před příkazem timeout
:
sudo timeout 300 tcpdump -n -w data.pcap
Odesílání specifických signálů
Pokud není dán žádný signál, timeout
po dosažení časového limitu použije signál SIGTERM na zadaný příkaz. Pomocí -s
můžete určit, který signál se má použít ( --signal
) možnost .
Chcete-li například odeslat SIGKILL
na příkaz ping
po jedné minutě můžete použít příkaz:
sudo timeout -s SIGKILL ping 8.8.8.8
Signál může být specifikován jeho jménem jako SIGKILL
nebo číslo jako 9
. Následující příkaz je identický s předchozím:
sudo timeout -s 9 ping 8.8.8.8
Chcete-li získat seznam všech dostupných signálů, použijte příkaz kill -l
:
kill -l
Zabijte zaseknutý proces
SIGTERM
, výchozí signál odeslaný při překročení časového limitu může být některými procesy zachycen nebo ignorován. V takovém případě proces pokračuje v běhu po odeslání signálu ukončení.
Chcete-li se ujistit, že se monitorovaný příkaz zastavil, použijte volbu -k
( --kill-after
) následuje časové období. Při použití této volby po dosažení daného časového limitu se spustí příkaz timeout
vyšle signál SIGKILL
na program odpovídající zadání uživatele.
V následujícím příkladu je to timeout
spustí příkaz po dobu jedné minuty, a pokud nebude ukončen, po deseti sekundách „zabije“ program:
sudo timeout -k 10 1m ping 8.8.8.8
timeout -k “./test.sh”
Proces bude po dosažení daného časového limitu ukončen, i když se zasekl.
Zachování stavu ukončení
timeout
vrátí 124
po dosažení časového limitu. Jinak příkaz timeout
vrátí stav ukončení spravovaného příkazu.
Chcete-li vrátit stav ukončení příkazu, i když vypršel časový limit, použijte volbu --preserve-status
:
timeout --preserve-status 5 ping 8.8.8.8
Spouštění příkazů v popředí
Ve výchozím nastavení timeout
spustí příkaz na pozadí. Pokud chcete spustit příkaz v popředí, použijte volbu --foreground
:
timeout --foreground 5m ./script.sh
Tato možnost je užitečná, když chcete spouštět interaktivní příkazy, které vyžadují vstup uživatele.
Závěr
Příkaz je timeout
slouží ke spuštění určitého příkazu s časovým limitem podle vůle uživatele.
Příkazy timeout
jsou jednoduché příkazy, které nemají mnoho možností. Obvykle použijete příkaz timeout
pouze se dvěma argumenty, trváním a příkazem, který se objeví.