Řešení 1:
Nejlepší metodou je spustit proces v terminálovém multiplexeru. Případně můžete zajistit, aby proces nepřijímal signál HUP.
Terminálový multiplexor poskytuje "virtuální" terminály, které běží nezávisle na "skutečném" terminálu (ve skutečnosti jsou dnes všechny terminály "virtuální", ale to je jiné téma pro jiný den). Virtuální terminál zůstane spuštěný, i když bude váš skutečný terminál uzavřen s vaší relací ssh.
Všechny procesy spuštěné z virtuálního terminálu budou nadále běžet s tímto virtuálním terminálem. Když se znovu připojíte k serveru, můžete se znovu připojit k virtuálnímu terminálu a všechno bude, jako by se nic nestalo, kromě času, který uplynul.
Dva oblíbené terminálové multiplexory jsou screen a tmux.
Obrazovka má strmou křivku učení. Zde je dobrý návod s diagramy vysvětlujícími tento koncept:http://www.ibm.com/developerworks/aix/library/au-gnu_screen/
Signál HUP (neboli SIGHUP) posílá terminál všem jeho podřízeným procesům, když je terminál uzavřen. Běžnou akcí po přijetí SIGHUP je ukončení. Když se tedy vaše relace ssh odpojí, všechny vaše procesy se ukončí. Abyste tomu zabránili, můžete zajistit, aby vaše procesy nepřijímaly SIGHUP.
Dvěma snadnými způsoby, jak to udělat, jsou nohup
a disown
.
Další informace o tom, jak nohup
a disown
práce přečtěte si tuto otázku a odpověď:https://unix.stackexchange.com/questions/3886/difference-between-nohup-disown-and
Poznámka:i když procesy poběží dál, nemůžete s nimi dále komunikovat, protože již nejsou připojeny k žádnému terminálu. Tato metoda je užitečná hlavně pro dlouho běžící dávkové procesy, které po spuštění již nepotřebují žádný uživatelský vstup.
Řešení 2:
Existuje několik způsobů, jak to udělat, ale ten, který považuji za nejužitečnější, je použít GNU Screen.
Po připojení ssh spusťte screen
. Tím se spustí další shell na obrazovce. Spusťte příkaz a poté stiskněte Ctrl -a d .
Tím se „odpojí“ od relace obrazovky. V tomto okamžiku se můžete odhlásit nebo dělat cokoli jiného, co chcete.
Když se chcete znovu připojit k relaci obrazovky, stačí spustit screen -RD
z příkazového řádku (jako stejný uživatel, který vytvořil relaci).
Řešení 3:
V bash
, disown
klíčové slovo se k tomu dokonale hodí. Nejprve spusťte proces na pozadí (buď použijte &
nebo ^Z
poté zadejte bg
):
$ wget --quiet http://server/some_big_file.zip &
[1] 1156
Zadáním jobs
můžete vidět, že proces je stále ve vlastnictví shellu:
$ jobs
[1]+ Running wget
Pokud byste se v tomto okamžiku odhlásili, byla by také zabita úloha na pozadí. Pokud však spustíte disown
, bash odpojí úlohu a umožní jí pokračovat v běhu:
$ disown
Můžete to potvrdit:
$ jobs
$ logout
Můžete dokonce kombinovat &
a disown
na stejném řádku, například:
$ wget --quiet http://server/some_big_file.zip & disown
$ logout
Je to lepší než spouštět nohup
podle mého názoru proto, že nezanechává nohup.out
soubory poseté po celém vašem souborovém systému. Také nohup
musí být spuštěn před spuštěním příkazu — disown
lze použít, pokud se až později rozhodnete, že chcete úkol umístit na pozadí a odpojit.
Řešení 4:
K tomu slouží nástroj nohup, který je k dispozici na většině linuxových boxů.
Řešení 5:
Abych byl důkladný, upozorním na tmux, který má stejnou základní myšlenku jako obrazovka:
tmux má být moderní, BSD licencovanou alternativou k programům, jako je GNU screen. Mezi hlavní funkce patří:
- Výkonné, konzistentní, dobře zdokumentované a snadno skriptovatelné příkazové rozhraní.
- Okno lze vodorovně a svisle rozdělit na panely.
- Panely lze libovolně přesouvat a měnit jejich velikost nebo je lze uspořádat do přednastavených rozvržení.
- Podpora pro terminály UTF-8 a 256 barev.
- Kopírujte a vložte pomocí více vyrovnávacích pamětí.
- Interaktivní nabídky pro výběr oken, relací nebo klientů.
- Změňte aktuální okno vyhledáním textu v cíli.
- Zamykání terminálu, ručně nebo po uplynutí časového limitu.
- Čistá, snadno rozšiřitelná kódová základna licencovaná BSD, v aktivním vývoji.
Je však přibližně nekonečně snazší hledat na Googlu.