GNU/Linux >> Znalost Linux >  >> Linux

Obnovit příkaz spuštěný ve zrušené relaci SSH

Řešení 1:

Pokus o připojení aktuálních deskriptorů souborů STD* nového terminálu ke starému běžícímu procesu si jen koleduje o potíže. I když se vám to podaří, řízení úloh terminálu nebude fungovat podle očekávání. Pokud nakonec převzatý program ukončíte, zůstane po vás nepořádek a co se stane s shellem, který obětoval své deskriptory souborů, aby byl předán nově založenému procesu. Zůstane ssh otevřené, když ten shell zmizí? Asi ne. Nejprve jej tedy budete muset přesměrovat někam jinam.

Je to možné nebo ne, vsadil bych se, že je vhodnější nechat opuštěný proces zabít "přirozeně". Pokud děláte něco dostatečně důležitého, abyste se pokusili provést veškerý hackerský útok potřebný k obnovení kontroly a jste na nestabilním spojení, měli byste to pravděpodobně vědět předem a použít obrazovku (nebo vnc, nebo cokoli, co plave na vaší lodi s odděleným ovládáním). :)

Řešení 2:

Vím, že je to stará otázka, ale cítil jsem, že je důležité přidat svá zjištění pro případ, že by s tím někdo narazil jako já.

Neviděl jsem žádné neobvyklé důsledky toho, že ano, ale tohle jsem použil a fungovalo to úžasně. Někdy, když na našem serveru spouštíme dlouhé procesy, příležitostně odpojí relaci ssh. Zdá se, že proces spolu s relací tty zůstává spuštěn, ale nemůžeme se k němu znovu připojit. Našel jsem níže uvedený program pro stažení procesu do nově připojené relace.

https://github.com/nelhage/reptyr

Zde je více informací

https://blog.nelhage.com/2011/02/change-ctty/

Řešení 3:

Obecně platí, že správný způsob, jak to zvládnout, je připravit se na to předem pomocí GNU screen nebo bash's nohup nebo disown mechanismy. Pokud používáte tcsh , shell odmítne úlohy na pozadí, když se nenormálně ukončí.

Pokud nepoužíváte screen ale podařilo se vám udržet váš proces spuštěný prostřednictvím jednoho z disown můžete být schopni předstírat opětovné připojení k procesu pomocí gdb (zdroj):

[...] s některými špinavými hacky není možné znovu otevřít proces stdout/stderr/stdin. [...]

A pak použijte gdb například pro připojení k procesu, proveďte somecall close(0)
zavřít hovor (1)
zavřít hovor (2)
call open("/dev/pts/xx", ...)
zavolat (0)
zavolat (0)
odpojit

Nyní byste museli tento proces upravit pro vaši situaci. Pochybuji, že by to pomohlo, pokud se vám nepodařilo zrušit proces. Pokud používáte bash , viz tento příspěvek o vytváření bash automaticky zakázat procesy na pozadí při ukončení (v zásadě vypněte huponexit s shopt ). U procesu na popředí musíte použít nohup .


Linux
  1. Ssh – Ponechat procesy spuštěné po odpojení relace Ssh?

  2. Jak zjistit, zda běží v linuxové konzoli oproti relaci ssh?

  3. EC2 ssh zlomené potrubí ukončí běžící proces

  1. Jak zobrazit výstup běžícího procesu v jiné relaci Bash?

  2. Určení konkrétního procesoru, na kterém běží proces

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

  1. Jak obnovit relaci Gnome?

  2. Jak zabít příkazový řádek Chromium přes Ssh?

  3. Ponechat program Python i po odhlášení z relace Ssh?