繁体   English   中英

我如何重新连接到一个独立的mosh会话?

[英]How do I reattach to a detached mosh session?

我如何重新连接到一个独立的mosh会话或以其他方式摆脱

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

也就是什么是mosh相当于

screen -D -R

或者可能

screen -wipe

此外,在文档中可以找到这个答案的位置?

出于安全原因,您无法重新连接,请参阅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连接,则此最后一个命令也会断开您的连接。

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

令人震惊的。

找到你的mosh-client的PID:

$ ps -ef | grep mosh

然后,根据他们的说明安装CRIU。

然后,检查点就像这样:

$ mkdir checkpoint

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

然后,恢复它:

$ sudo ./criu restore -D checkpoint --shell-job

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

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

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

cd mosh

vim configure.ac

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

然后做:

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

。/配置

使

make install

之后,您的CRIU-checkpointed mosh客户端会话将重新启动。

(显然你需要写一些东西来定期执行检查点才能有用。但是,这对读者来说是一种练习)。

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

“好吧,首先,如果你想要能够从多个客户端连接到一个会话(或者在客户端死亡之后),你应该使用screen或tmux .Mosh是SSH的替代品(在某些情况下),而不是屏幕。许多Mosh用户将它与屏幕一起使用,就像那样。“

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

Mosh:你在这台服务器上有一个独立的Mosh会话(mosh [XXXX])。

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

杀XXXX

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

屏幕-r

现在,htop(或正在运行的任何进程)就像没有中断一样回来了。这对于运行升级或其他进程尤其有用,如果突然中断,服务器将处于凌乱的未知状态。 我假设你可以用tmux做同样的事情,虽然我没有尝试过。 我相信这就是Annihilannic和eskhool的建议。

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

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

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

要仅杀死分离的会话,您可以使用以下行(我在.bashrc作为别名)。

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

该命令取决于who列出连接用户(包括mosh会话),只有附加的mosh会话具有“通过mosh”,并且mosh会话将其pid放在方括号中。 所以它找到了仅用于分离的mosh会话的pids并使用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手册页的更多信息。 我正在使用上面的命令,因为一旦出现别名,对我来说似乎更简单。

注意,正如@Annihilannic所提到的,如果你在你的mosh会话中使用tmux / screen,那么那些tmux / screen会话在你杀死mosh会话之后仍然存在。 所以你仍然可以依附于他们(所以你真的不会因为杀死mosh会话而损失很多)。

这里的答案声称杀死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>

而我只注意杀死我认识的会话(共享系统)。

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

使用此命令终止mosh PID:

kill <pid>

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

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

kill `pidof mosh-server`

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM