Uma transferência `scp` fecha quando eu fecho o shell?


29

Eu tenho scptransferência (de um servidor remoto para outro), isso é bastante grande.

Então, talvez eu queira fechar o computador do qual executei este comando, isso encerrará a transferência? Eu tenho sshacesso ao shell usando o programa Bitwise.

Respostas:


34

Existem várias soluções.

Antecedentes e renegar o processo

  1. Abra o terminal ssh no servidor remoto.
  2. Comece a scptransferência como de costume.
  3. Em segundo plano o processo scp ( Ctrl+ Z, depois o comando bg.)
  4. Rejeite o processo em segundo plano ( disown).
  5. Encerre a sessão ( exit) e o processo continuará sendo executado na máquina remota.

Uma desvantagem dessa abordagem é que os descritores de arquivo para stdout e stderr ainda conterão referências ao tty da sua sessão ssh. O terminal pode travar quando você tenta sair por causa disso. Você pode contornar isso digitando ~.para forçar o fechamento do seu cliente ssh (essa sequência de escape deve seguir uma nova linha ... veja também ~?). Se o processo que você está abandonando grava no stdout ou stderr, o processo pode sair prematuramente se o buffer tty sobrecarregar.

Criar uma sessão de tela e desanexá-la

O GNU Screen pode ser usado para criar uma sessão de terminal remoto, que pode ser desanexada e continuar em execução no servidor após o logoff da sessão. Você pode fazer login novamente no servidor posteriormente e reconectar à sessão.

  1. Efetue login no servidor remoto por ssh.
  2. Inicie uma sessão na tela screen -D -R <session_name>.
  3. Comece a scptransferência como de costume.
  4. Desanexe a sessão da tela com Ctrl+ Aentão d.
  5. Encerre a sessão ssh ( exit)

Para reconectar à sessão:

  1. Efetue login no servidor remoto por ssh.
  2. Reconecte à sessão da tela, screen -D -R <session_name>

Execute o comando sem hangups

Veja a resposta usando nohup.

Use um agendador de tarefas

Essa é a melhor solução se esse for um tipo de tarefa periódica que você deseja automatizar.

Use crontab, atou batchpara agendar a transferência.


Oi Damien, obrigado pela ótima variedade de respostas e formatação. Mas eu queria ter alguma clareza sobre por que você especificou o -D -Rinício das bandeiras screen. Eu li a página man e não me ajudar a entender: -D -R Attach here and now. ...
hello_there_andy

@hello_there_andy O manual indica o que -DR faz claramente. Basicamente, se você já tiver uma sessão de tela em execução, ela será reconectada a ela em vez de criar uma nova sessão (mesmo se um usuário estiver conectado a ela via SSH - ela será expulsa, o que é útil se o usuário estiver travando devido para uma conexão de rede ruim.)
Damien Ó Ceallaigh

1
Observe que especificar um nome de sessão é opcional.
Damien Ó Ceallaigh

Ok, eu acho que entendo, mas acho que pensei (talvez de maneira errada) que foi isso que screen -r <session>fez ... então a -DRdiferença é -rque pode expulsá-los? Não basta reconectar e falhar se outro usuário estiver nele.
1513617

Eu fiz alguns testes para ter certeza. -D faz o que -d faz, exceto que também fecha a conexão SSH (desconecta o usuário), além de apenas desanexar as sessões de tela existentes. -r reconecta a sessão. -R reconecta uma sessão existente, mas criará uma nova sessão se não existir (-r falharia se não houver uma sessão para reconectar.) Portanto, fiquei um pouco impreciso na minha descrição anterior.
Damien Ó Ceallaigh

10

Você pode usar nohup(1), ou seja, fazer algo como:

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

Isso criará uma saída de nohup.out. Então você pode sair com segurança.


O &no final fez a diferença para mim! Obrigado!
winklerrr

6

Sim, será encerrado. A solução para manter a sessão do terminal ativa sem conectividade é o 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 dito acima, você pode usar o comando screen, por exemplo:

  • Criar tela

user@server:~$ screen -S bigscptransfer

  • Você está agora na tela

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

  • Desconecte da tela usando CTRL+ Ae pressioneD

[detached from 5899.bigscptransfer]

  • Continue a sessão quando precisar com:

user@server:~$ screen -r bigscptransfer


-1

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

pare temporariamente o comando com

CTRL + z

colocar em segundo plano o comando, digite:

bg

Você pode verificar o processo com:

empregos

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.