Jak udržovat procesy spuštěné po ukončení session ssh?

514

Řekněme, že spouštím spoustu procesů z relace ssh. Je možné ukončit relaci ssh při zachování těchto procesů ve vzdáleném počítači?

    
dané Olivier Lalonde 21.10.2010 14:09

14 odpovědí

603

Měli byste hledat moderní alternativy jakotmux.

tmux je lepší zscreen z mnoha důvodů, zde jsou jen některé příklady:

  • Windows lze přesunout mezi relacemi a dokonce propojit s více relacemi
  • Windows lze rozdělit horizontálně a vertikálně do panelů
  • Podpora barevných terminálů UTF-8 a 256
  • Sessions lze ovládat z shellu bez nutnosti zadat relaci

Základní funkce

Chcete-li získat stejnou funkcionalitu, jak je popsáno v odpovědi doporučujícíscreen, musíte provést následující:

  • ssh do vzdáleného počítače
  • spusťtetmux zadánímtmux do shellu
  • spusťte požadovaný proces uvnitř spuštěné relacetmux
  • Ponechte / odpojte relacitmux zadáním Ctrl + b a poté d

Nyní se můžete bezpečně odhlásit ze vzdáleného počítače, váš proces bude pokračovat v prácitmux. Když se znovu vrátíte a chcete zkontrolovat stav vašeho procesu, můžete použíttmux attach k připojení k vaší relacitmux.

Chcete-li mít více relací spuštěných vedle sebe, měli byste pojmenovat každou relaci pomocí Ctrl + b a$. Seznam aktuálně spuštěných relací můžete získat pomocí příkazutmux list-sessions, nyní připojte k běžící relaci příkazemtmux attach-session -t 0.

tmux může dělat mnohem více pokročilých věcí, než zvládnout jedno okno v jedné relaci. Další informace naleznete vman tmux nebo stránce tmux GitHub . Zejména naleznete zde nejčastější dotazy o hlavních rozdílech meziscreen atmux.

    
odpověděl tongpu 23.11.2012 10:26
220

Nejlepší způsob je často nejjednodušší.

nohup long-running-command &

Byl vytvořen speciálně pro toto, dokonce i logy stdout na nohup.log

man nohup

Chcete-li "některé" již běžící úkoly "na pozadí", pak je nejlepším řešením ctrl + z a pak spusťte

bg (bude to na pozadí vaše poslední pozastavená úloha, což vám umožní pokračovat v běhu)

pak rychlédisown by měl udržovat proces běžící po odhlášení.

screen a ostatní to mohou udělat, ale to není to, proč jsou. Doporučujinohup pro úkoly, o kterých víte, že necháte za sebou abg pro úkoly, které již běží a nechcete znovu spustit.

Mějte na paměti, obojí je specifické pro bash. Pokud nepoužíváte bash, mohou být příkazy odlišné.

    
odpověděl coteyr 28.11.2012 03:58
180

Můžete to udělat pomocíscreen.

Zadejteman screen, chcete-li se dozvědět více nebo přečíst tuto stránku s obrazovkou .

Jednoduchý scénář:

  • ssh do vzdálené schránky. Typscreen Poté spusťte požadovaný proces.

  • Stiskněte Ctrl - A pak Ctrl - D . Tím se "oddělí" relace obrazovky, ale vaše procesy se spustí. Nyní se můžete odhlásit ze vzdálené schránky.

  • Chcete-li se vrátit později, přihlaste se znovu a zadejtescreen -r Toto bude "pokračovat" v relaci obrazovky a můžete vidět výstup vašeho procesu.

odpověděl Lincoln 21.10.2010 14:20
73

Obrazovka a nohup je lepší způsob, ale pokud musíte odpojit proces již běžící bez obrazovky nebo nohup, můžete spustit příkaz disown.

  

disown [-ar] [-h] [ jobspec … | pid … ]

     

Bez možností odstraňte každý jobspec z tabulky aktivních úloh. Je-li zadána možnost-h, úloha není odebrána z tabulky, ale je označena tak, že SIGHUP není odeslána do úlohy, pokud shell obdrží SIGHUP. Není-li jobspec a není k dispozici možnost-a ani-r, použije se aktuální úloha. Pokud není k dispozici jobspec , volba-a znamená odstranit nebo označit všechny úlohy; volba-r bez argumentu jobspec omezuje operaci na běžné úlohy.

Při odpojení můžete zavřít terminál a spustit proces v zařízení.

    
odpověděl bassgey 21.10.2010 15:19
39

Byl jsem přilepený ve velkém mv, takže jsem nebyl schopen zastavit proces, nastavit obrazovku a znovu spustit. Podařilo se mi ukončit relaci ssh proces, který běží, a to v podstatě podle následujících kroků:

  1. ssh [server]
  2. příkaz
  3. CTRL + Z
  4. bg
  5. odpojení
  6. ukončení

Krok 3 pozastaví aktuální proces (např. můj příkaz "mv"). Krok 4 přenese pozastavený proces do pozadí a obnoví jej. Krok 5 umožňuje zrušit proces.

    
odpověděl Chaos 25.11.2013 04:30
20

Existují dva hlavní programy, které můžete použít k udržování programů a stavu terminálu přes několik ssh připojení. Jsou to obrazovky (oficiální, ale bohužel nepodložené.) Zdá se, že je nyní aktivně vyvíjen . a>) a tmux (novější, aktivně udržované). Byobu je přední konec, který může fungovat na vrcholu svých systémů a nabízí další informace o stavu ubuntu. V nových instalacích použije tmux jako backend, pokud máte starší instalaci byobu a existující konfiguraci bude zachovat předchozí backend, ať už je to obrazovka nebo tmux.

Byobu

Byobu může být nainstalován v počítači tak, že se v počítači se systémem Debian:

sudo aptitude install byobu

Použití yum, děláte

su -c 'yum install byobu'

Je také možné nainstalovat byobu na jiné distribuce.

Používání byobu

Po připojení pomocí ssh můžete spustit příkaz byobu spuštěnímbyobu na hostitelském počítači. To vám dá shell, který vypadá takto:

Můžete také použít terminál Byobu na zařízení Ubuntu s volbou -X a snadno získat perfektně pracující byobu.

Použití:

Spusťte příkaz byobu zadánímbyobu.

Můžete stisknout F2 pro vytvoření nového okna v rámci aktuální relace, F3-F4 pro přepínání mezi různými okny.

Nejlepší část o byobu je, že nemusíte skutečně zabíjet procesy běžící v terminálu a opustit terminál. Můžete jednoduše poslat obrazovku / tmux (kostru byobu) na pozadí a pokračovat v příštím příjezdu:

  • Chcete-li ponechat příkaz byobu a spustit jej (odpojit), stiskněte klávesu F6.
  • Při příštím příchodu stačí udělatbyobu a vy sholud se vrátit přímo tam, kde jste byli.

Můžete také vytvořit různé relace byobu podlebyobu -S session1 a tak dále. A když se vrátíte, můžete se k nim připojit.

Pomocí nástroje Byobu můžete udělat mnohem víc. Použij to! Některé konečné pokyny jsou zde , zde nebo zde .

    
odpověděl SiddharthaRT 24.11.2012 23:09
17

Nemůžete to udělat, jakmile proces začal, je třeba nastavit věci před spuštěním dlouhotrvající úlohy.

Můžete použít nohup , ale moderní moudrost naznačuje, že používáte obrazovku nebo byobu jako své přihlašovací údaje, abyste mohli odpojit a nechat věci běh.

Obrazovka má tu výhodu, že se můžete odpojit od jednoho stroje a znovu připojit k němu, což je užitečné, pokud chcete zkontrolovat dlouhodobé procesy, které běží po skončení pracovního dne.

Existuje rozumný začátek průvodce na obrazovce zde.

byobu poskytuje snadno použitelné rozhraní na obrazovce s nabídkami atd. Je to také aktuální implementace obrazovky na novějších ubuntu. F2 pro spuštění nového terminálu F3 / F4 pro přepnutí zpět a zpět a F6 pro odpojení. Zadejte výstup skutečně ukončit terminály.

    
odpověděl Richard Holloway 21.10.2010 14:16
8

Hej, zatímco jsem souhlasil s tím, že obrazovka je nejúčinnější možností. Vncserver můžete použít a spustit proces na něm.

Pokud máte jediný zájem o to, aby byl proces spuštěn a nebylo nutné ho převzít, a zcela mimořádně důležité jste si nebyli vědomi, že budete muset ukončit relaci a proces již běží, nejste pokud jste použili bash jako shell

Nejprve je třeba odeslat proces na pozadí zadáním kláves Ctrl + Z a následně bg% 1 (číslo závisí na čísle úlohy, obvykle je 1, ale můžete jednoduše vytisknout pomocí příkazových úloh)

Nakonec spusťte odpojení příkazu (následovaný příkazem jobid ... same as příkazem bg)

Tím se odstraní vztah rodič-dítě mezi vaším shellem a procesem na pozadí, který zabrání tomu, aby zemřel, když byl shell ukončen.

    
odpověděl Jorge Gutierrez 06.06.2011 23:29
8

Jeden shell skript, který jsem běžel po dlouhou dobu, se přihlásím a spustit proces na pozadí pomocí '&'.

Příklad:

/path/to/my/script &

Odhlášil jsem a odpojil jsem SSH relaci. Když se přihlásím nějakou dobu později, skript stále pokračuje, jak dokazuje souvislý sběr dat ze skriptu.

    
odpověděl user108430 29.07.2014 16:58
4

Vyzkoušejte obrazovku GNU a zjistěte, zda vám to pomůže. V závislosti na tom, jak potřebujete aplikaci spouštět v reálném čase, může způsobit více problémů, než vyřeší, ale přinejmenším vám umožní obnovit relaci, jako kdybyste ji nikdy neopustili.

Jak používat:

  • Pro první spuštění použijte příkazscreen, projděte úvodní zprávy a obdržíte terminál.
  • C-a C-c otevře jiný terminál
  • C-a C-k zabije terminál
  • C-C Space a C-Backspace můžete procházet terminály
  • C-a C-a je užitečné, pokud používáte většinou pouze dva terminály
  • C-a C-d odpojí aktuální relaci obrazovky a ukončí obrazovky. Pak můžete použítscreen -r k obnovení relace. Můžete mít několik oddělených relací obrazovky najednou, v tomto případě se zobrazí seznam dostupných relací.

Existuje mnoho dalších možností, například rozdělené obrazovky a také všechny klávesové zkratky jsou plně přizpůsobitelné.

    
odpověděl T. Verron 22.05.2012 17:31
3

Nejjednodušší odpověď ...

Ctrl + z pozastaví spuštěný program

"bg" jej spustí na pozadí

    
odpověděl Roop 13.08.2013 02:28
3

Nejjednodušší je spustit příkaz na pozadí s&. Pak stačí napsat:

disown -a
    
odpověděl Zibri 11.01.2017 04:52
0

Zatímco všichni říkají, že používajídisown (jediná možnost, kterou máte po spuštění procesu),nohup, nebo dokonce spuštění příkazu vscreen, což je užitečné, pokud chcete vidět veškerý výstup z příkazu ... Jsem fanoušekscreen .. Stále jsem vyzkoušel nejnovější distribuce Linuxu hlavního proudu a jednoduše uvedu práci do pozadí a ukončení nevyvolává všechny procesy, které běží, aby zemřely. Musí existovat globální nastavení nebo tak něco. Snažím se to na nějakých hezky starých systémech (slackware 12) a můj testovací skript stále běží, dokud ho ručně nezabiju:

shell$ cat > test.pl

#!/usr/bin/perl
while(1){
     sleep(1);
}
    shell$ perl ./test.pl &
    shell$ exit
    logout
    shell$ ps aux test.pl
    mymom 31337     1  0 13:25 ?        00:00:00 perl ./test.pl
    shell$ 

Přestože souhlasím s tím, žescreen by byl nejlepší způsob, jak to spustit, a to i v případě, že můj skript zapisuje soubory nebo cokoli jiného. Nikdy jsem nepotřeboval použítdisown -a nebonohup úplná paranoia. Možná někdo může osvětlit, jak se bash chová standardně? Možná někteří administrátoři systému změní výchozí hodnoty na velkých skořápkách, aby udrželi procesy uživatelů nadměrně zatěžující systém?

    
odpověděl Dan Gullage 29.07.2015 19:42
-1

Namísto:

cmd options; 

Přidat přednohup:

nohup cmd options & 

Potom budete mít možnost zobrazit konzolu stdout:

tail -f nohup.out
    
odpověděl Abdennour TOUMI 22.10.2016 12:51