我如何重新连接到一个独立的舞会会议?

我如何重新连接到一个分离的摩西会议或以其他方式摆脱

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

也就是说,什么是莫斯科等同于

screen -D -R

或者有可能

screen -wipe

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

81602 次浏览

出于安全原因,不能重新连接,请参阅 https://github.com/keithw/mosh/issues/394

要终止分离的会话,请使用该消息中显示的 PID 号(即‘ XXXX’部分)例如,如果你看到

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

并且可以运行以下命令:

kill 12345

此外,要关闭 所有跳舞连接,你可以:

kill `pidof mosh-server`

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

令我惊讶的是,我使用 CRIU (https://criu.org)检查和重新启动了一个 moh 客户端,它起作用了。

令人震惊。

找到你的 Mosh 客户的 PID:

$ps-ef | grep moh

然后,按照他们的指示安装 CRIU。

然后,像这样检查:

$mkdir 检查站

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

然后,恢复它:

$sudo./criu 恢复-D 检查点—— shell-job

就是这样,你的摩西客户回来了。

然而,需要注意的一点是,如果你的笔记本电脑重启(这正是我们试图防止的重点) ,mosh 使用 monotonic时钟来跟踪客户端的时间,这在重启时不起作用。这不会工作,但是,如果你的笔记本电脑只是全速崩溃它不会工作,因为 moh 序列号将不同步的版本,被检查(二进制将恢复,但通信将停止)。

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

CD 舞曲

Vim configure.ac

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

然后:

Autoreconf # 或./autogen.sh,如果您是第一次克隆它

./configure

制造

安装

在此之后,您的 CRIU 检查点 moh 客户端会话将在重新启动后生存。

(显然,您需要编写一些东西来定期执行检查点,以便使其足够有用。但是,这只是对读者的一种练习)。

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

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

我知道这是一篇老文章,但是有一个非常简单的解决方案,正如摩西作者 Keith Winstein 所建议的那样: https://github.com/mobile-shell/mosh/issues/394

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

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

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

我要做的就是 取消之前的舞会

杀了 XXXX

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

萤幕 R

现在,htop (或正在运行的任何进程)回来了,没有中断。这对于运行升级或其他进程特别有用,如果突然中断,这些进程会使服务器处于混乱、未知的状态。我假设你也可以这样做,虽然我还没有尝试过。我相信这就是安尼希兰尼克和埃斯库所暗示的。

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

要只杀死分离的会话,可以使用以下代码行(我在 .bashrc中使用它作为别名)。

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

这个命令取决于这样一个事实,即 who列出了包括 moh 会话在内的连接用户,只有附加的 moh 会话有“ via moh”,而 moh 会话的 pid 在方括号内。所以它只找到分离的 moh 会话的 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 服务器环境变量 MOSH_SERVER_SIGNAL_TMOUT。你可以在 服务器端.bashrc上设置为300左右。然后如果你执行 pkill -SIGUSER1 mosh-server,它只会杀死在过去300秒内没有连接的 moh 服务器(其他服务器会忽略 SIGUSER1)。更多信息在 Mosh- 服务器手册页。我使用上面的命令是因为,一旦别名,它对我来说似乎更简单。

注意,正如@Annihilannic 提到的,如果你在你的 moh 会话中使用 tmux/screen,那么在你杀死 moh 会话之后,这些 tmux/screen 会话仍然存在。所以你仍然可以依附于他们(所以你真的不会失去很多通过取消热舞会议本身)。

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

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

在迈克尔 · R · 海因斯(Michael R. Hines)的 criu答案旁边,还有一个稍微“轻一些”的 reptyr,它可以用来重新连接由 mosh-server启动的进程(即不是 mosh-server本身)。我通常会用

pstree -p <mosh-server PID>

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

reptyr PID

将所需的进程重新连接到当前终端

kill -USR1 <mosh-server PID>

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

使用 注意命令获取正在运行的任务列表或使用 (咒语)

使用以下命令杀死 mosh PID:

kill <pid>

此外,关闭所有的摩西连接,你可以:

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

kill `pidof mosh-server`