如何重新连接到分离的mosh会话或以其他方式摆脱
Mosh: You have a detached Mosh session on this server (mosh [XXXX]).
即。
是什么?screen -D -R
或可能
screen -wipe
此外,在文档中可以找到这个答案吗?
答案 0 :(得分:169)
出于安全原因,您无法重新连接,请参阅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连接,则此最后一个命令也会断开您的连接。
答案 1 :(得分:20)
令我惊讶的是,我使用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客户端会话将在重新启动后继续存在。
(显然你需要写一些东西来定期执行检查点才能有用。但是,这对读者来说是一种练习。)
答案 2 :(得分:11)
我意识到这是一篇很老的帖子,但是有一个非常简单的解决方案,正如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
和重新连接到仍然存在的屏幕会话。
screen -r
现在,htop(或正在运行的任何进程)就像没有中断一样回来了。这对于运行升级或其他进程尤其有用,如果突然中断,服务器将处于凌乱的未知状态。我假设你可以用tmux做同样的事情,虽然我没有尝试过。我相信这就是Annihilannic和eskhool的建议。
答案 3 :(得分:8)
作为Varta答案的补充,我使用以下命令关闭除当前连接之外的所有mosh连接:
pgrep mosh-server | grep -v $(ps -o ppid --no-headers $$) | xargs kill
答案 4 :(得分:4)
正如@varta指出的那样,出于安全原因,mosh所有者非常反对从不同的客户端重新连接。因此,如果您的客户已经离开(例如您重新启动了笔记本电脑),您唯一的选择就是杀死会话。
要仅删除已分离的会话,您可以使用以下行(我在.bashrc
中将其作为别名)。
who | grep -v 'via mosh' | grep -oP '(?<=mosh \[)(\d+)(?=\])' | xargs kill
该命令取决于who
列出连接用户(包括mosh会话),仅附加的mosh会话具有“via 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 man page中的更多信息。我正在使用上面的命令,因为一旦出现别名,对我来说似乎更简单。
注意,正如@Annihilannic所提到的,如果你在你的mosh会话中使用tmux / screen,那么那些tmux / screen会话在你杀死mosh会话后仍然存在。所以你仍然可以依附于他们(所以你真的不会因为杀死mosh会话而损失很多)。
答案 5 :(得分:0)
这里的答案声称杀死mosh-server
是唯一的选择,因为我们可以使用criu
和reptyr
恢复并重新附加任意进程。
更不用说如今,我们可以kill -USR1 mosh-server
仅以一种干净安全的方式杀死分离的会话,而不必借助不安全的who
输出或繁琐的命令来避免杀死我们自己的会话。
Michael R. Hines的criu
回答旁边是“轻量级” reptyr
,它可以用来重新附加由mosh-server
开始的进程(即mosh-server
本身)。我通常使用
pstree -p <mosh-server PID>
列出分离的mosh服务器下的进程树,然后
reptyr PID
将所需的过程重新连接到我的当前终端。对我关心的所有过程重复该过程之后,我
kill -USR1 <mosh-server PID>
我会小心地只杀死我知道属于我(共享系统)的会话。
答案 6 :(得分:0)
使用 ps 命令获取正在运行的任务的列表,或使用 ps -ef | grep mosh
使用以下命令杀死Mosh PID:
kill <pid>
此外,要关闭所有mosh连接,您可以:
请注意,如果您当前通过mosh连接,那么这也会断开您的连接
kill `pidof mosh-server`