基本功能

基本功能

假设我从 ssh 会话启动了一组进程。是否可以终止 ssh 会话,同时保持这些进程在远程计算机上运行?

答案1

您应该寻找类似的现代替代品tmux

tmux优于screen其他原因有很多,这里仅举几个例子:

  • 窗口可以在会话之间移动,甚至可以链接到多个会话
  • 窗户可以水平或垂直分割成窗格
  • 支持 UTF-8 和 256 色终端
  • 可以从 shell 控制会话,无需进入会话

基本功能

要获得与回答推荐screen,您需要执行以下操作:

  • ssh 进入远程机器
  • 首先在 shell 中tmux输入tmux
  • tmux在已启动的会话中启动所需的进程
  • tmux通过输入Ctrl+b然后退出/分离会话d

您现在可以安全地从远程计算机注销,您的进程将继续在内部运行tmux。当您再次回来并想要检查进程的状态时,您可以使用它tmux attach来附加到您的tmux会话。

如果要让多个会话并行运行,则应使用Ctrl+b和命名每个会话。您可以使用或简单地$获取当前正在运行的会话列表,现在使用命令 附加到正在运行的会话。tmux list-sessionstmux lstmux attach-session -t <session-name>

tmux可以做比在单个会话中处理单个窗口更高级的事情。有关更多信息,请查看man tmuxtmux GitHub 页面。 尤其,这是常见问题解答screen关于和之间的主要区别tmux

答案2

选项1:nohup

最好的方法往往是最简单的方法。

nohup long-running-command &

它是专门为此制作的,它甚至将标准输出记录到nohup.log

man nohup

选项 2:bg+disown

Ctrl+Z后跟:

bg
disown -h

如果您想要“后台”已经运行的任务,则Ctrl+Z然后运行bg将您最近暂停的任务置于后台,允许其继续运行。disown将在您注销后保持进程运行。该-h标志可防止挂断。


screen其他人也可以这样做,但这不是它们的用途。我建议你将其nohup用于那些你知道要留下的任务以及bg那些你已经在运行但不想重新开始的任务。

请记住,两者都是 bash 专用的。如果您不使用 bash,则命令可能会有所不同。

答案3

您可以使用 来实现这一点screen

键入man screen以了解更多信息或阅读此内容屏幕手册页

简单场景:

  • ssh 进入你的远程框。输入screen。然后启动你想要的进程。

  • Ctrl+ A,然后Ctrl按 + D。这将“分离”您的屏幕会话,但您的进程仍保持运行。您现在可以退出远程框。

  • 如果您想稍后再回来,请再次登录并输入screen -r这将“恢复”您的屏幕会话,您可以看到您的进程的输出。

答案4

我被困在一个很大的 mv 中,所以我无法停止进程、设置屏幕,然后重新启动它。我设法通过执行以下步骤退出正在运行进程的 SSH 会话:

  1. 建立 SSH 连接:ssh user@host
  2. 运行所需命令来启动该进程
  3. Ctrl+Z暂停进程
  4. 运行bg将暂停的进程放在后台并恢复它。
  5. 运行disown [pid](进程 ID 可选,默认为最后一个进程)以放弃该进程。要获取作业列表,只需jobs在之前键入即可。
  6. 通过运行退出 SSH 会话logout

命令用法disown

disown [-ar] [-h] [jobspec ... | pid ... ]
              Without  options,  remove  each jobspec from the table of active
              jobs.  If jobspec is not present, and neither the -a nor the  -r
              option  is  supplied, the current job is used.  If the -h option
              is given, each jobspec is not removed from  the  table,  but  is
              marked  so  that  SIGHUP  is  not  sent  to the job if the shell
              receives a SIGHUP.  If no jobspec is  supplied,  the  -a  option
              means  to  remove or mark all jobs; the -r option without a job‐
              spec argument restricts operation to running jobs.   The  return
              value is 0 unless a jobspec does not specify a valid job.

相关内容