当我关闭 shell 时,`scp` 传输是否关闭?

Bor*_*lis 36 ssh scp

我有scp转移(从一个远程服务器到另一个),这是相当大的。

所以也许我想关闭我执行此命令的计算机,这会结束传输吗?我可以ssh使用程序 Bitwise 访问 shell。

Dam*_*dow 41

有多种解决方案。

背景和否认过程

  1. 打开 ssh 终端到远程服务器。
  2. scp照常开始传输。
  3. 将 scp 进程设为后台(Ctrl+ Z,然后是命令bg。)
  4. 否认后台进程 ( disown)。
  5. 终止会话 ( exit),进程将继续在远程机器上运行。

这种方法的一个缺点是 stdout 和 stderr 的文件描述符仍将包含对 ssh 会话的 tty 的引用。因此,当您尝试退出时,终端可能会挂起。您可以通过键入~.强制关闭您的 ssh 客户端来解决此问题(该转义序列必须跟随一个新行...另请参阅~?)。如果您要放弃的进程写入 stdout 或 stderr,并且 tty 缓冲区溢出,则该进程可能会过早退出。

创建一个屏幕会话并分离它

GNU Screen可用于创建远程终端会话,该会话可以在您注销会话后分离并继续在服务器上运行。然后,您可以在以后重新登录服务器并重新连接到会话。

  1. 通过 ssh 登录远程服务器。
  2. 启动屏幕会话,screen -D -R <session_name>
  3. scp照常开始传输。
  4. 使用Ctrl+ Athen分离屏幕会话d
  5. 终止 ssh 会话 ( exit)

重新连接到会话:

  1. 通过 ssh 登录远程服务器。
  2. 重新连接到屏幕会话, screen -D -R <session_name>

在没有挂断的情况下运行命令

使用查看答案nohup

使用任务计划程序

如果这是您想要自动化的定期任务,这是最好的解决方案。

使用crontabatbatch来安排传输。


von*_*and 10

您可以使用nohup(1), 即执行以下操作:

nohup scp alice@source:/the/answer/of/all bob@target.example.com:/var/tmp/42 &
Run Code Online (Sandbox Code Playgroud)

这将创建一个输出nohup.out。然后您可以安全地注销。


Ser*_*rge 6

是的,它将被终止。在没有连接的情况下保持终端会话活动的解决方案是screen程序:

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.
Run Code Online (Sandbox Code Playgroud)