Soluzione 1:
Il tentativo di connettere i descrittori di file STD * correnti di un nuovo terminale a un vecchio processo in esecuzione è solo un problema. Anche se riesci a farlo, il controllo del lavoro del terminale non funzionerà come previsto. Rimarrai un pasticcio se alla fine esci dal programma acquisito e cosa succede alla shell che ha sacrificato i suoi descrittori di file per essere consegnato al processo appena in background. ssh rimarrà aperto quando quel guscio se ne andrà? Probabilmente no. Quindi dovrai prima reindirizzarlo da qualche altra parte.
Possibile o no, scommetto che è più desiderabile lasciare che il processo abbandonato venga ucciso "naturalmente". Se stai facendo qualcosa di abbastanza importante da giustificare il tentativo di fare tutto l'hacking necessario per riprendere il controllo e sei su un collegamento instabile, dovresti probabilmente saperlo in anticipo e usare semplicemente lo schermo (o vnc, o qualsiasi altra cosa faccia galleggiare la tua barca a controllo distaccato). :)
Soluzione 2:
So che questa è una vecchia domanda, ma ho ritenuto importante aggiungere le mie scoperte nel caso in cui qualcun altro si imbattesse in questo come me.
Non ho visto conseguenze insolite nel fare questo sì, ma questo è quello che ho usato e ha funzionato in modo sorprendente. A volte, quando eseguiamo lunghi processi sul nostro server, occasionalmente disconnetterà la sessione ssh. Il processo insieme alla sessione tty sembra rimanere in esecuzione ma non possiamo riconnetterci ad esso. Ho trovato il programma di seguito per eseguire il pull del processo nella sessione appena connessa.
https://github.com/nelhage/reptyr
Ecco ulteriori informazioni
https://blog.nelhage.com/2011/02/changing-ctty/
Soluzione 3:
Generalmente, il modo giusto per gestire questo è prepararsi in anticipo, usando GNU screen
o nohup
di bash o disown
meccanismi. Se stai usando tcsh
, la shell rinnegherà i processi in background quando esce in modo anomalo.
Se non stai usando screen
ma sono riuscito a mantenere il tuo processo in esecuzione tramite uno dei rinnegati metodi, potresti essere in grado di simulare la riconnessione al processo con gdb
(fonte):
[...] con alcuni sporchi hack, non è impossibile riaprire stdout/stderr/stdin di un processo. [...]
E poi usa gdb per esempio per collegarti al processo, fai qualche chiamata close(0)
chiudi la chiamata(1)
chiudi la chiamata(2)
chiama open("/dev/pts/xx", ...)
chiama duplicato(0)
chiama duplicato(0)
stacca
Ora, dovresti modificare questo processo per la tua situazione. Dubito che aiuterebbe se non riuscissi a rinnegare il processo. Se stai usando bash
, guarda questo post sulla creazione di bash automaticamente rinnegare processi in background all'uscita (in pratica, disattiva huponexit con negozio ). Con un processo in primo piano, devi aver utilizzato nohup .