[英]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
是唯一的选择,这在很大程度上是过时的,因为我们可以使用criu
和reptyr
来恢复和重新连接任意进程。
且不说现在我们可以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.