假设我从 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-sessions
tmux ls
tmux attach-session -t <session-name>
tmux
可以做比在单个会话中处理单个窗口更高级的事情。有关更多信息,请查看man tmux
或tmux 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 会话:
- 建立 SSH 连接:
ssh user@host
- 运行所需命令来启动该进程
- 按Ctrl+Z暂停进程
- 运行
bg
将暂停的进程放在后台并恢复它。 - 运行
disown [pid]
(进程 ID 可选,默认为最后一个进程)以放弃该进程。要获取作业列表,只需jobs
在之前键入即可。 - 通过运行退出 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.