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