¿Se cierra una transferencia `scp` cuando cierro el shell?


29

Tengo scptransferencia (de un servidor remoto a otro), eso es bastante grande.

Entonces, tal vez quiero cerrar la computadora desde la que ejecuté este comando, ¿finalizará la transferencia? Tengo sshacceso al shell usando el programa Bitwise.

Respuestas:


34

Hay varias soluciones.

Antecedentes y rechazo del proceso

  1. Abra la terminal ssh en el servidor remoto.
  2. Comience la scptransferencia como de costumbre.
  3. Fondo del proceso scp ( Ctrl+ Z, luego el comando bg).
  4. Desconoce el proceso en segundo plano ( disown).
  5. Termine la sesión ( exit) y el proceso continuará ejecutándose en la máquina remota.

Una desventaja de este enfoque es que los descriptores de archivo para stdout y stderr aún contendrán referencias al tty de su sesión ssh. El terminal puede bloquearse cuando intenta salir debido a esto. Puede solucionar este problema escribiendo ~.para forzar el cierre de su cliente ssh (esa secuencia de escape debe seguir una nueva línea ... ver también ~?). Si el proceso que está abandonando escribe en stdout o stderr, el proceso puede salir prematuramente si el búfer tty se llena en exceso.

Crear una sesión de pantalla y separarla

GNU Screen se puede usar para crear una sesión de terminal remota, que se puede desconectar y continuar ejecutándose en el servidor después de cerrar la sesión. Luego puede volver a iniciar sesión en el servidor en una fecha posterior y volver a conectarlo a la sesión.

  1. Inicie sesión en el servidor remoto a través de ssh.
  2. Iniciar una sesión de pantalla, screen -D -R <session_name>.
  3. Comience la scptransferencia como de costumbre.
  4. Separe la sesión de pantalla con Ctrl+ y Aluego d.
  5. Terminar la sesión ssh ( exit)

Para volver a adjuntar a la sesión:

  1. Inicie sesión en el servidor remoto a través de ssh.
  2. Vuelva a conectar a la sesión de pantalla, screen -D -R <session_name>

Ejecute el comando sin bloqueos

Ver la respuesta usando nohup.

Use un programador de tareas

Esta es la mejor solución si se trata de un tipo de tarea periódica que desea automatizar.

Use crontab, ato batchpara programar la transferencia.


Hola Damien, gracias por la buena variedad de respuestas y formatos. Pero quería aclarar por qué especificaste el -D -Rinicio de las banderas screen. Leí la página del manual y no me ayudó a entender: -D -R Attach here and now. ...
hello_there_andy

@hello_there_andy El manual establece lo que hace -DR claramente. Básicamente, si ya se está ejecutando una sesión de Screen, se volverá a conectar a ella en lugar de crear una nueva sesión (incluso si un usuario ha iniciado sesión a través de SSH; los expulsará, lo que es útil si el usuario está pendiente) a una mala conexión de red.)
Damien Ó Ceallaigh

1
Tenga en cuenta que especificar un nombre de sesión es opcional.
Damien Ó Ceallaigh

Ok, creo que entiendo, pero supongo que pensé (tal vez erróneamente) que eso screen -r <session>fue lo que hizo ... ¿entonces -DRes diferente simplemente -rporque puede expulsarlos? No solo vuelve a conectar y falla si otro usuario está en él.
hello_there_andy

Hice algunas pruebas para estar seguro. -D hace lo que hace -d, excepto que también cerrará la conexión SSH (cerrará la sesión del usuario) además de desconectar cualquier sesión de pantalla existente. -r vuelve a conectar la sesión. -R vuelve a asociar una sesión existente, pero creará una nueva sesión si no existe (-r fallaría si no hay una sesión para volver a adjuntar). Por lo tanto, estaba un poco inexacto en mi descripción anterior.
Damien Ó Ceallaigh

10

Podría usar nohup(1), es decir, hacer algo como:

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

Esto creará una salida de nohup.out. Entonces puede cerrar sesión de forma segura.


¡Al &final hizo la diferencia para mí! ¡Gracias!
winklerrr

6

Sí, se terminará. La solución para mantener viva la sesión de terminal sin conectividad es el screenprograma:

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

Como se dijo anteriormente, puede usar el comando de pantalla, por ejemplo:

  • Crear pantalla

user@server:~$ screen -S bigscptransfer

  • Ahora estas en la pantalla

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

  • Separar de la pantalla usando CTRL+ y Aluego presionarD

[detached from 5899.bigscptransfer]

  • Reanude la sesión cuando la necesite con:

user@server:~$ screen -r bigscptransfer


-1

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

detener temporalmente el comando con

CTRL + z

poner en segundo plano el comando, escriba:

bg

puedes verificar el proceso con:

trabajos

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.