GNU/Linux >> Linux Esercitazione >  >> Linux

Riprendi il comando in esecuzione nella sessione SSH interrotta

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 .


Linux
  1. Ssh:mantieni i processi in esecuzione dopo la disconnessione della sessione Ssh?

  2. Come riprendere una sessione di Gnome?

  3. Come sapere se è in esecuzione in una console Linux rispetto a una sessione ssh?

  4. Esecuzione di script PHP dalla riga di comando come processo in background

  5. EC2 ssh pipe rotta termina il processo in esecuzione

Comando Pstree in Linux

Kill Command in Linux

Comando SSH

Comando dello schermo Linux:mantieni i processi in esecuzione nonostante una connessione interrotta

Reptyr:sposta un processo in esecuzione da un terminale all'altro senza chiuderlo

Come scoprire da quanto tempo è in esecuzione un processo in Linux