GNU/Linux >> Znalost Linux >  >> Linux

Udržování běžícího linuxového procesu po mém odhlášení

Ř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.


Linux
  1. Linux – je to proces, který má řídicí terminál, nebo je to relace, která má řídicí terminál?

  2. Jak restartovat (nebo resetovat) běžící proces v Linuxu?

  3. Jak zabít proces běžící na konkrétním portu v Linuxu?

  1. Jak zastavit proces obrazovky v linuxu?

  2. Proces běžící na pozadí byl v linuxu zabit

  3. Jak poznám, že běžím na linuxové obrazovce nebo ne?

  1. Jak zabít proces běžící na konkrétním portu v Linuxu?

  2. Proces Linuxu na pozadí - Zastaveno v úlohách?

  3. v linuxové konzoli, jak NEzabalit výstup