【问题标题】:How do I reattach to a detached mosh session?如何重新连接到分离的 mosh 会话?
【发布时间】:2013-07-25 07:54:06
【问题描述】:

如何重新连接到分离的 mosh 会话或以其他方式摆脱

Mosh: You have a detached Mosh session on this server (mosh [XXXX]).

即什么是mosh等价物

screen -D -R

或者可能

screen -wipe

此外,在文档中哪里可以找到这个答案?

【问题讨论】:

  • 通常,如果会话断开连接,Mosh 会重新连接(或尝试)。当您输入新输入时,它会尝试重新连接(用于 flakey 连接或切换连接)。对于追随者,这种“分离的 Mosh 会话”发生在您硬杀客户端窗口时。

标签: ssh


【解决方案1】:

出于安全原因,不能重新附加,见https://github.com/keithw/mosh/issues/394

要终止已分离的会话,请使用该消息中显示的 PID 号(即“XXXX”部分。)例如,如果您看到 --

Mosh: You have a detached Mosh session on this server (mosh [12345]).

并且可以运行这个命令:

kill 12345

此外,要关闭 所有 mosh 连接,您可以:

kill `pidof mosh-server`

请注意,如果您当前是通过 mosh 连接的,那么最后一条命令也会断开您的连接。

【讨论】:

  • @artfulrobot 因为分离的会话有可能属于在某个地方仍然存在的 mosh 客户端。 Mosh 会话漫游并且可以通过挂起/恢复(例如,“休眠”)周期存活。 mosh 没有(也不容易)解决的问题是检测到客户端计算机在没有正常关闭 mosh 会话的情况下重新启动。
  • 有理由不使用killall mosh-server 吗?尤其是因为 pidof 和 killall 无论如何都是一回事。
  • @Jordan:在某些系统(例如 Solaris)上,killall完全按照它所说的那样做。
  • 如果您通过 mosh 连接并运行 killall mosh-server,您将断开连接。
  • @0xcaff 如果您通过 mosh 连接并运行 kill `pidof mosh-server`,您将被相同地分离
【解决方案2】:

令我惊讶的是,我使用 CRIU (https://criu.org) 来检查点并重新启动 mosh 客户端并且它起作用了。

令人震惊。

找到你的 mosh-client 的 PID:

$ ps -ef | grep mosh

然后,按照他们的说明安装 CRIU。

然后,像这样检查它:

$ mkdir 检查点

$ sudo ./criu dump -D checkpoint -t PID --shell-job

然后,恢复它:

$ sudo ./criu restore -D 检查点 --shell-job

而且,就是这样。你的 mosh 客户端回来了。

但是,需要注意的一点是,如果您的笔记本电脑重新启动(这是我们试图防止的全部问题),mosh 使用monotonic 时钟在客户端跟踪时间,这不会重新启动后不起作用。但是,如果您的笔记本电脑完全崩溃,这将不起作用,因为 mosh 序列号将与检查点的版本不同步(二进制文件将恢复,但通信将停止)。

为了解决这个问题,您需要告诉 mosh 停止这样做并下载 mosh 源代码。然后,编辑这个文件:

cd mosh

vim 配置.ac

然后,搜索GETTIME 并注释掉该行。

然后做:

autoreconf # 或 ./autogen.sh 如果你是第一次克隆它

./配置

制作

进行安装

之后,您的 CRIU 检查点 mosh 客户端会话将在重新启动后继续存在。

(很明显,您需要编写一些内容来定期执行检查点,这样才有用。但是,这是给读者的练习)。

【讨论】:

  • 一定要在恢复后输入“CTRL-L”刷新屏幕输出。
  • 纯粹出于好奇,恢复我丢失的 mosh 客户端会话是否有实际好处?我在 mosh 上运行 tmux,然后可以在客户端上重新启动 mosh 并重新连接 tmux……这样做除了很酷(它真的很酷!)之外还有其他好处吗?
  • 长答案:github.com/mobile-shell/mosh/issues/394 短答案是,是的:如果 mosh-server 守护进程已经在目标服务器上运行,则不需要 tmux 会话。它不仅留下了悬空的 mosh 守护进程,而且它还有另一组我们不应该首先输入的击键。
  • Mosh 是 SSH 的替代品(在某些情况下),而不是屏幕。 quoth keithw (mosh author) on github
【解决方案3】:

我意识到这是一篇旧帖子,但有一个非常简单的解决方案,正如 mosh 作者 Keith Winstein 所建议的那样:https://github.com/mobile-shell/mosh/issues/394

“嗯,首先,如果您希望能够从多个客户端(或在客户端死亡后)附加到会话,您应该使用 screen 或 tmux。Mosh 是 SSH 的替代品(在某些情况下),而不是屏幕。许多 Mosh 用户将它与屏幕一起使用并喜欢这种方式。”

场景:我通过 mosh 登录到远程服务器。然后,我运行了 screen 并在 screen 会话中运行了一个进程,例如 htop。我失去了连接(笔记本电脑电池没电了,失去了网络连接等)。我通过 mosh 再次连接并在服务器上获取该消息,

Mosh:您在此服务器上有一个分离的 Mosh 会话 (mosh [XXXX])。

我所要做的就是杀死之前的 mosh 会话

杀死XXX

重新连接到仍然存在的屏幕会话

屏幕-r

现在,htop(或任何正在运行的进程)恢复原状,没有中断。这对于运行升级或其他进程特别有用,如果突然中断,会使服务器处于混乱、未知的状态。我假设你可以用 tmux 做同样的事情,虽然我还没有尝试过。我相信这是 Annihilannic 和 eskhool 所建议的。

【讨论】:

  • 这是一个很好的答案。谢谢,是的,我确认它与 tmux 相同。
  • 一个比接受的更好的答案,谢谢。
【解决方案4】:

作为 Varta 答案的补充,我使用以下命令关闭除当前连接之外的所有 mosh 连接:

pgrep mosh-server | grep -v $(ps -o ppid --no-headers $$) | xargs kill

【讨论】:

  • 如果没有旧的 mosh 会话,xkill 会抛出错误。更好地使用pgrep mosh-server | grep -v $(ps -o ppid --no-headers $$) && xargs kill || echo "no active sessions to kill"
【解决方案5】:

正如@varta 所指出的,出于安全原因,mosh 所有者非常反对从不同的客户端重新连接。因此,如果您的客户端消失了(例如,您重新启动了笔记本电脑),您唯一的选择就是终止会话。

要仅终止分离的会话,您可以使用以下行(我在 .bashrc 中将其作为别名)。

who | grep -v 'via mosh' | grep -oP '(?<=mosh \[)(\d+)(?=\])' | xargs kill

该命令取决于以下事实:who 列出了包括 mosh 会话在内的已连接用户,只有附加的 mosh 会话具有“通过 mosh”,并且 mosh 会话的 pid 位于方括号中。所以它只为分离的 mosh 会话找到 pid,并使用 xargs 将它们传递给 kill。

这是一个示例who结果供参考:

$ who
theuser    pts/32       2018-01-03 08:39 (17X.XX.248.9 via mosh [193891])
theuser    pts/17       2018-01-03 08:31 (17X.XX.248.9 via mosh [187483])
theuser    pts/21       2018-01-02 18:52 (mosh [205286])
theuser    pts/44       2017-12-21 13:58 (:1001.0)

另一种方法是使用 mosh-server 环境变量 MOSH_SERVER_SIGNAL_TMOUT。您可以在 服务器端.bashrc 中将其设置为 300。然后,如果您执行pkill -SIGUSER1 mosh-server,它只会杀死在过去 300 秒内未连接的 mosh 服务器(其他服务器将忽略 SIGUSER1)。更多信息在mosh-server man page。我正在使用上面的命令,因为一旦使用别名,它对我来说似乎更简单。

注意,正如@Annihilannic 所提到的,如果您在 mosh 会话中使用 tmux/screen,那么在您终止 mosh 会话后,那些 tmux/screen 会话仍然存在。所以你仍然可以附加到它们(所以你真的不会因为杀死 mosh 会话本身而损失太多)。

【讨论】:

    【解决方案6】:

    此处声称杀死 mosh-server 是唯一选项的答案在很大程度上已经过时,因为我们可以使用 criureptyr 来恢复和重新附加任意进程。

    更不用说现在我们可以kill -USR1 mosh-server 只以干净安全的方式杀死分离的会话,而无需诉诸不安全的who 输出或繁琐的命令来避免杀死我们自己的会话。

    在Michael R. Hines 的criu 答案旁边,有稍微“轻量级”的reptyr,可用于重新附加由mosh-server 启动的进程(即不是mosh-server 本身) .我通常使用

    pstree -p <mosh-server PID>
    

    列出分离的 mosh-server 下的进程树,然后

    reptyr PID
    

    将所需的进程重新附加到我当前的终端。在对我关心的所有进程重复该过程后,我

    kill -USR1 <mosh-server PID>
    

    而我注意只杀死我知道是我的会话(共享系统)。

    【讨论】:

    • 我收到Unable to attach to pid 10103: Permission denied
    • 错误:openssl 在地窖中没有版本“1.0.2s”。
    【解决方案7】:

    使用ps命令获取正在运行的任务列表或使用ps -ef | grep mosh

    使用此命令杀死 mosh PID:

    kill <pid>
    

    另外,要关闭所有 mosh 连接,您可以:

    请注意,如果您当前通过 mosh 连接,那么这也会断开您的连接

    kill `pidof mosh-server`
    

    【讨论】:

      猜你喜欢
      • 2022-07-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 2019-07-27
      • 2014-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多