Jak pozastavit Bash skript pomocí příkazu Linux Sleep

Příkaz sleep v Linuxu je nástroj, který dočasně pozastaví běh procesu. Možná to zní paradoxně, ale někdy je nečinnost přesně to, co potřebujeme. Tento článek vám ukáže, jak efektivně využívat tento příkaz v prostředí Bash.

Použití příkazu sleep je velmi jednoduché. V terminálu stačí zadat sleep, mezeru, číslo a stisknout Enter. Například:

sleep 5

Kurzor na pět sekund zmizí a poté se znovu objeví. Co se vlastně stalo? Příkaz sleep v podstatě dává Bash pokyn, aby pozastavil provádění příkazů na zadanou dobu. V našem příkladu to bylo pět sekund.

Dobu pozastavení můžeme zadávat v sekundách, minutách, hodinách a dnech. Stačí použít příponu s pro sekundy, m pro minuty, h pro hodiny a d pro dny. Například pro pozastavení na jeden den, čtyři hodiny, sedm minut a pět sekund zadáme:

sleep 1d 4h 7m 5s

Přípona s (pro sekundy) je volitelná. Pokud žádnou příponu neuvedeme, sleep bude automaticky předpokládat, že se jedná o sekundy. Pokud bychom tedy chtěli pozastavení na pět minut a dvacet sekund, jeden ze správných zápisů by byl:

sleep 5m 20

Pokud bychom zapomněli uvést příponu m pro minuty, příkaz by se nejprve pozastavil na pět sekund a následně na dvacet sekund. Celkově by tedy došlo k pozastavení na 25 sekund.

Zatímco u mnoha příkazů je nutné dodržovat přesné pořadí parametrů, příkaz sleep je v tomto ohledu velmi benevolentní. Parametry můžeme zadávat v libovolném pořadí a sleep si s nimi poradí. Kromě toho můžeme zadávat i čísla s desetinnou čárkou. Například 0.5h je platný způsob, jak vyjádřit pozastavení na půl hodiny.

Všechny následující příkazy (i ty poněkud zvláštní) způsobí pozastavení na 10 sekund:

sleep 10
sleep 5 5s
sleep 1 1 1s 1 1 1s 1 2
sleep 0.16667m

Použití sleep pro pozastavení před provedením příkazu

Příkaz sleep můžeme použít k pozastavení před spuštěním jiného příkazu. Následující příkaz se pozastaví na 15 sekund a poté vydá pípnutí:

sleep 15 && echo -en '\a'

Použití sleep pro pauzu mezi dvěma příkazy

Příkaz sleep nám také umožňuje vkládat pauzy mezi více příkazy. Následující příklad vypíše obsah adresáře Dokumenty, poté se pozastaví na pět sekund a nakonec se přesune do domovského adresáře:

ls -R ~/Dokumenty && sleep 5 && cd ~

Použití sleep pro pozastavení běhu skriptu

Příkaz sleep má své nezastupitelné místo také v shell skriptech, kde nám umožňuje pozastavit jejich běh na přesně definovanou dobu. To se hodí například, když potřebujeme, aby určitý proces měl dostatek času na dokončení, než skript bude pokračovat dál. Můžeme ho také použít k omezení frekvence požadavků skriptu na externí zdroj.

Pro názornou ukázku si představme skript, který pomocí nástroje curl volá webovou službu Google. Na základě ISBN knihy vrací data ve formátu JSON, ze kterých následně pomocí jq extrahujeme název knihy. Aby skript nezatěžoval webovou službu, vkládáme mezi jednotlivé požadavky sekundovou pauzu.

Vytvořte soubor s následujícím obsahem a uložte ho jako check_book.sh:

#!/bin/bash

for book in `cat $1`
do
 echo $book":"
 curl -s https://www.googleapis.com/books/v1/volumes?q=isbn:$book | jq '.items | .[] | .volumeInfo.title'
 echo ""
 sleep 1
done

echo "All done."

Následujícím příkazem nastavíme skript jako spustitelný:

chmod +x check_book.sh

Skript vyžaduje nástroje curl a jq. Pokud používáte Ubuntu nebo jinou distribuci založenou na Debianu, nainstalujete je pomocí apt-get. V ostatních distribucích Linuxu použijte nástroj pro správu balíčků specifický pro vaši distribuci.

sudo apt-get install curl
sudo apt-get install jq

Dále vytvoříme textový soubor books.txt s ISBN knih:

9781565921276
9781874416685
9781565921672
9780521431088
9781491941591

Skript spustíme zadáním:

./check_book.sh books.txt

Požadavky na webovou službu Google jsou odesílány s jednosekundovými intervaly. Po každém dotazu na ISBN se zobrazí název knihy.

To je vše k příkazu sleep. Podrobnější fungování skriptu check_book.sh je nad rámec tohoto článku. Skript byl vybrán pouze jako ukázka praktického použití příkazu sleep. Pokud se chcete dozvědět více o nástrojích curl a jq, navštivte stránku projektu curl a on-line manuál jq.