Un trasferimento `scp` si chiude quando chiudo la shell?


29

Ho un scptrasferimento (da un server remoto a un altro), che è piuttosto grande.

Quindi forse voglio chiudere il computer dal quale ho eseguito questo comando, questo terminerà il trasferimento? Ho sshaccesso alla shell usando il programma Bitwise.

Risposte:


34

Esistono numerose soluzioni.

Contesto e rinnegamento del processo

  1. Aprire il terminale SSH sul server remoto.
  2. Inizia il scptrasferimento come al solito.
  3. Background il processo scp ( Ctrl+ Z, quindi il comando bg.)
  4. Annullato il processo in background ( disown).
  5. Termina la sessione ( exit) e il processo continuerà a essere eseguito sul computer remoto.

Uno svantaggio di questo approccio è che i descrittori di file per stdout e stderr conterranno ancora riferimenti al tty della sessione ssh. Il terminale potrebbe bloccarsi quando si tenta di uscire per questo motivo. Puoi aggirare questo problema digitando ~.per forzare la chiusura del tuo client ssh (quella sequenza di escape deve seguire una nuova riga ... vedi anche ~?). Se il processo che si sta abbandonando scrive su stdout o stderr, il processo potrebbe terminare prematuramente se il buffer tty si riempie eccessivamente.

Creare una sessione schermo e staccarla

La schermata GNU può essere utilizzata per creare una sessione terminale remota, che può essere staccata e continuare a funzionare sul server dopo essersi disconnessi dalla sessione. È quindi possibile accedere nuovamente al server in un secondo momento e ricollegarlo alla sessione.

  1. Accedi al server remoto tramite ssh.
  2. Avviare una sessione di screen, screen -D -R <session_name>.
  3. Inizia il scptrasferimento come al solito.
  4. Stacca la sessione dello schermo con Ctrl+, Aquindi d.
  5. Termina la sessione ssh ( exit)

Per ricollegarsi alla sessione:

  1. Accedi al server remoto tramite ssh.
  2. Riattaccare alla sessione schermo, screen -D -R <session_name>

Esegui il comando senza interruzioni

Vedi la risposta usando nohup.

Utilizzare un Utilità di pianificazione

Questa è la soluzione migliore se si tratta di un tipo di attività periodica che si desidera automatizzare.

Utilizzare crontab, ato batchper pianificare il trasferimento.


Ciao Damien, grazie per la bella varietà di risposte e formattazione. Ma volevo un po 'di chiarezza sul perché hai specificato l' -D -Ravvio delle bandiere screen. Ho letto la pagina man e non mi ha aiutato a capire: -D -R Attach here and now. ...
hello_there_andy,

@hello_there_andy Il manuale indica cosa fa chiaramente -DR. Fondamentalmente, se hai già una sessione Schermo in corso, si ricollegherà ad essa anziché creare una nuova sessione (anche se un utente è connesso ad essa tramite SSH - li eliminerà, il che è utile se l'utente è in sospeso a causa a una cattiva connessione di rete.)
Damien Ó Ceallaigh,

1
Si noti che specificare un nome di sessione è facoltativo.
Damien Ó Ceallaigh,

Ok, penso di aver capito, ma immagino di aver pensato (forse a torto) che è quello che ha screen -r <session>fatto ... quindi -DRè diverso dal fatto -rche può eliminarli? Non solo ricollegare e fallire se un altro utente è su di esso.
hello_there_andy,

Ho fatto alcuni test per essere sicuro. -D fa quello che fa -d, tranne per il fatto che chiuderà anche la connessione SSH (disconnettendo l'utente) oltre a staccare qualsiasi sessione Screen esistente. -r ricollega la sessione. -R ricollega una sessione esistente, ma creerà una nuova sessione se non esiste (-r fallirebbe se non ci fosse una sessione a cui ricollegarsi.) Quindi, ero leggermente impreciso nella mia descrizione precedente.
Damien Ó Ceallaigh,

10

Puoi usare nohup(1), ad esempio, fare qualcosa del tipo:

nohup scp alice@source:/the/answer/of/all bob@target.example.com:/var/tmp/42 &

Questo creerà un output di nohup.out. Quindi puoi disconnetterti in modo sicuro.


Alla &fine ha fatto la differenza per me! Grazie!
winklerrr

6

Sì, verrà chiuso. La soluzione per mantenere viva la sessione terminale senza connettività è il screenprogramma:

SCREEN(1)                                                            SCREEN(1)

NAME
       screen - screen manager with VT100/ANSI terminal emulation

SYNOPSIS
       screen [ -options ] [ cmd [ args ] ]
       screen -r [[pid.]tty[.host]]
       screen -r sessionowner/[[pid.]tty[.host]]

DESCRIPTION
       Screen is a full-screen window manager that multiplexes a physical ter‐
       minal between several processes (typically interactive  shells).   Each
       virtual terminal provides the functions of a DEC VT100 terminal and, in
       addition, several control functions from the ISO 6429  (ECMA  48,  ANSI
       X3.64)  and ISO 2022 standards (e.g. insert/delete line and support for
       multiple character sets).  There is a  scrollback  history  buffer  for
       each virtual terminal and a copy-and-paste mechanism that allows moving
       text regions between windows.

2

Come detto sopra, è possibile utilizzare il comando screen, ad esempio:

  • Crea schermo

user@server:~$ screen -S bigscptransfer

  • Ora sei sullo schermo

ser@server:~$ scp bigfile.dat server2:.

  • Staccare dallo schermo usando CTRL+ Aquindi premereD

[detached from 5899.bigscptransfer]

  • Riprendi la sessione quando ne hai bisogno con:

user@server:~$ screen -r bigscptransfer


-1

nohup scp shinto @ source: / home / data roose@target.example.com: / var / tmp / file

interrompere temporaneamente il comando con

CTRL + Z

metti in background il comando, digita:

bg

puoi verificare il processo con:

lavori

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.