
Obvykle, když spustíte příkaz v terminálu, musíte počkat, až příkaz skončí, než budete moci zadat další. To se nazývá spuštění příkazu v popředí nebo procesu na popředí. Když proces běží v popředí, zabírá váš shell a můžete s ním komunikovat pomocí vstupních zařízení.
Co když dokončení příkazu trvá dlouho a vy chcete mezitím spustit jiné příkazy? K dispozici máte několik možností. Nejviditelnější a nejpřímější možností je spustit novou relaci shellu a spustit v ní příkaz. Další možností je spustit příkaz na pozadí.
Proces na pozadí je proces/příkaz, který se spouští z terminálu a běží na pozadí bez interakce uživatele.
V tomto článku budeme hovořit o procesech na pozadí Linuxu. Ukážeme vám, jak spustit příkaz na pozadí a jak udržet proces spuštěný i po zavření shellové relace.
Spustit příkaz Linux na pozadí #
Chcete-li spustit příkaz na pozadí, přidejte symbol ampersand (&
) na konci příkazu:
command &
ID úlohy shellu (v závorkách) a ID procesu budou vytištěny na terminálu:
[1] 25177
Na pozadí můžete mít spuštěno několik procesů současně.
Proces na pozadí bude pokračovat v psaní zpráv na terminál, ze kterého jste příkaz vyvolali. Chcete-li potlačit stdout
a stderr
zprávy používají následující syntaxi:
command > /dev/null 2>&1 &
>/dev/null 2>&1
znamená přesměrování stdout
na /dev/null
a stderr
na stdout
.
Použijte jobs
nástroj pro zobrazení stavu všech zastavených úloh a úloh na pozadí v aktuální relaci shellu:
jobs -l
Výstup obsahuje číslo úlohy, ID procesu, stav úlohy a příkaz, který úlohu spustil:
[1]+ 25177 Running ping google.com &
Chcete-li přenést proces na pozadí do popředí, použijte fg
příkaz:
fg
Pokud máte více úloh na pozadí, zahrňte %
a ID úlohy za příkazem:
fg %1
Chcete-li ukončit proces na pozadí, použijte kill
příkaz následovaný ID procesu:
kill -9 25177
Přesunout proces v popředí na pozadí #
Přesunutí běžícího procesu v popředí na pozadí:
- Zastavte proces stisknutím
Ctrl+Z
. - Přesuňte zastavený proces na pozadí zadáním
bg
.
Ponechat procesy na pozadí spuštěné po ukončení shellu #
Pokud vaše připojení přestane fungovat nebo se odhlásíte z relace prostředí, procesy na pozadí se ukončí. Existuje několik způsobů, jak udržet proces spuštěný po skončení relace interaktivního shellu.
Jedním ze způsobů je odstranit úlohu z ovládání úloh prostředí pomocí disown
vestavěný shell:
disown
Pokud máte více než jednu úlohu na pozadí, uveďte %
a ID úlohy za příkazem:
disown %1
Pomocí jobs -l
potvrďte, že je úloha odstraněna z tabulky aktivních úloh příkaz. Chcete-li vypsat všechny běžící procesy, včetně odmítnutých, použijte ps aux
příkaz.
Dalším způsobem, jak udržet proces spuštěný po ukončení shellu, je použít nohup
.
nohup
příkaz spustí jiný program zadaný jako jeho argument a ignoruje všechny SIGHUP
(zavěšení) signály. SIGHUP
je signál, který je odeslán do procesu, když je jeho řídicí terminál uzavřen.
Spuštění příkazu na pozadí pomocí nohup
příkaz, zadejte:
nohup command &
Výstup příkazu je přesměrován na nohup.out
soubor.
nohup: ignoring input and appending output to 'nohup.out'
Pokud se odhlásíte nebo zavřete terminál, proces nebude ukončen.
Alternativy #
Existuje řada programů, které vám umožňují mít více interaktivních relací současně.
Obrazovka #
Screenor GNU Screen je program terminálového multiplexeru, který vám umožňuje spustit relaci obrazovky a otevřít libovolný počet oken (virtuálních terminálů) uvnitř této relace. Procesy běžící na obrazovce budou pokračovat, když jejich okno nebude viditelné, i když budete odpojeni.
Tmux #
Tmuxi je moderní alternativa k obrazovce GNU. Pomocí Tmux můžete také vytvořit relaci a otevřít v ní více oken. Relace Tmux jsou trvalé, což znamená, že programy běžící v Tmux pokračují v běhu, i když zavřete terminál.
Závěr č.
Chcete-li spustit příkaz na pozadí, zahrňte &
na konci příkazu.
Když spustíte příkaz na pozadí, nemusíte čekat na jeho dokončení, než budete moci provést další.
Pokud máte nějaké dotazy nebo zpětnou vazbu, neváhejte zanechat komentář.